找出JavaScript数组是否包含对象的最简洁有效的方法是什么?
这是我知道的唯一方法:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好,更简洁的方法来实现这一目标?
这与Stack Overflow问题密切相关问题在JavaScript数组中查找项目的最佳方法是什么?它使用的方法寻找数组中的对象indexOf.
javascript arrays algorithm time-complexity javascript-objects
我以这个简单的HTML为例:
<div id="editable" contenteditable="true">
text text text<br>
text text text<br>
text text text<br>
</div>
<button id="button">focus</button>
Run Code Online (Sandbox Code Playgroud)
我想要简单的事情 - 当我点击按钮时,我想将插入符号(光标)放入可编辑div中的特定位置.通过网络搜索,我将这个JS附加到按钮点击,但它不起作用(FF,Chrome):
var range = document.createRange();
var myDiv = document.getElementById("editable");
range.setStart(myDiv, 5);
range.setEnd(myDiv, 5);
Run Code Online (Sandbox Code Playgroud)
是否可以像这样设置手动插入位置?
我正在使用一个明确的跨浏览器解决方案,当contentEditable ='on'<div>重新获得焦点时,将光标/插入位置设置为最后的已知位置.看来内容可编辑div的默认功能是每次单击它时将插入符/光标移动到div中文本的开头,这是不合需要的.
我相信当他们离开div的焦点时我必须在变量中存储当前光标位置,然后当他们再次聚焦时重新设置它,但是我无法将它组合在一起,或者找不到工作代码示例.
如果有人有任何想法,工作代码片段或样本我很乐意看到它们.
我还没有任何代码,但这里有我所拥有的:
<script type="text/javascript">
// jQuery
$(document).ready(function() {
$('#area').focus(function() { .. } // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>
Run Code Online (Sandbox Code Playgroud)
PS.我已经尝试过这个资源,但它似乎不适用于<div>.也许只适用于textarea(如何将光标移动到可信实体的末尾)
Chrome中的输出:
<div id="content" contenteditable="true" style="border:1px solid #000;width:500px;height:40px;">
hey
<div>what's up?</div>
<div>
<button id="insert_caret"></button>
Run Code Online (Sandbox Code Playgroud)
我相信FF看起来像这样:
hey
<br />
what's up?
Run Code Online (Sandbox Code Playgroud)
在IE中:
hey
<p>what's up?</p>
Run Code Online (Sandbox Code Playgroud)
不幸的是,没有很好的方法来制作它,以便每个浏览器插入一个<br />而不是div或p-tag,或者至少我在网上找不到任何东西.
无论如何,我现在要做的是,当我按下按钮时,我希望将插入符号设置在文本的末尾,所以它应该看起来像这样:
hey
what's up?|
Run Code Online (Sandbox Code Playgroud)
任何方式这样做,所以它适用于所有浏览器?
例:
$(document).ready(function()
{
$('#insert_caret').click(function()
{
var ele = $('#content');
var length = ele.html().length;
ele.focus();
//set caret -> end pos
}
}
Run Code Online (Sandbox Code Playgroud) 我想#在用户输入时使用jquery在压缩空间后添加Diez标签.我从codepen.io 创建了这个DEMO.
在这个演示中,当您编写示例(how are you)时,javascript代码将像这样(#how #are #you)更改它.
我正在检查用function addHashtags(text) { ... }这个函数添加#(diez)标签的单词.
1-)所以通常它适用于英文字符.但我想做多种语言.现在的问题是我输入像(ü???öç)这样的土耳其字符.那么当我用土耳其语字写的时候发生了什么.你可以用这个词来测试它.当我写(üzüm)或(hüseyin)时,javascript应该更改像(#üzüm #hüseyin)这样的单词,但事实并非如此.它正在添加像这样(#ü#zü#m #hü#seyin).
(解决了)
2-)另一个问题是其他一些语言.当用户键入阿拉伯语,阿塞拜疆语,日语等时,Javascript不会添加#(diez)标签.当我写(????????????)或(?????????????????????)等时,没有任何反应.这对我来说是个大问题.我需要一个解决方案.
(解决了)
3-)如果您查看DEMO,您可以看到我使用过textInput.它不起作用,Firefox但在移动设备上工作.因此,如果我使用keypress代码正在工作FireFox但不在移动设备上工作.我的代码应该适用于所有设备.
(解决了)
$(document).ready(function() {
window.mobilecheck = function() {
var check = false;
(function(a) {
if (
/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
a
) ||
/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 …Run Code Online (Sandbox Code Playgroud)在我的项目中,我试图将插入位置始终设置为文本的末尾.我知道这是默认行为,但是当我们动态添加一些文本时,插入符号位置会更改为Chrome和firefox中的起点(IE很好,太棒了).
无论如何要使它在chrome和firefox中正常工作?
这是小提琴
<div id="result" contenteditable="true"></div>
<button class="click">click to add text</butto>
Run Code Online (Sandbox Code Playgroud)
var result = $('#result');
$('.click').click(function () {
var preHtml = result.html();
result.html(preHtml + "hello");
result.focus();
});
Run Code Online (Sandbox Code Playgroud)
我尝试添加,setStart并setEnd在此链接中提到,但没有用.
如果HTML元素可以包含一些文本,我是否可以测试(使用纯javascript或jQuery)干净而强大的方式?
例如,<br>,<hr>或<tr>不能包含文本节点,同时<div>,<td>还是<span>可以的.
测试此属性的最简单方法是控制标记名称.但这是最好的解决方案吗?我认为这是最糟糕的......
编辑:为了澄清问题的意义,需要指出完美的答案应该考虑两个问题:
显然,前一个列表的每个点都有一个子答案.
我希望将插入符号正好位于其当前位置前方四个位置,以便我可以正确插入一个标签.我已经在插入符号的位置处获得了HTML插入,但是当我插入HTML时,插入符号被遗忘.我花了大约一个小时左右的时间看各种方法来做这件事,我已经尝试了很多,但我不能让他们中的任何一个为我工作.这是我尝试过的最新方法:
function moveCaret(input, distance) {
if(input.setSelectionRange) {
input.focus();
input.setSelectionRange(distance, distance);
} else if(input.createTextRange) {
var range = input.createTextRange();
range.collapse(true);
range.moveEnd(distance);
range.moveStart(distance);
range.select();
}
}
Run Code Online (Sandbox Code Playgroud)
它绝对没有 - 不移动插入符,抛出任何错误或任何东西.这让我感到困惑.是的,我知道上面的方法集(应该)将插入符号从指定节点的开头(即input)开始设置在某个位置,但即使这样也不起作用.那么,我究竟做错了什么,我该怎么做呢?
编辑:基于ov提供的链接,我已经设法将一些东西拼凑在一起,最终做了一些事情:抛出一个错误.好极了!这是新代码:
this.moveCaret = function(distance) {
if(that.win.getSelection) {
var range = that.win.getSelection().getRangeAt(0);
range.setStart(range.startOffset + distance);
} else if (that.win.document.selection) {
var range = that.win.document.selection.createRange();
range.setStart(range.startOffset + distance);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,这给出了错误Uncaught Error: NOT_FOUND_ERR: DOM Exception 8.有什么想法吗?
我试图将光标设置为next/prev contenteditable标签的末尾,如果当前的标签是空的,但是当我设置焦点时,它会将焦点添加到文本的开头而不是结束尝试几乎所有解决方案都在SO上但似乎没有为我工作.这是我正在尝试的简单代码
HTML代码
<div id = 'main'>
<div id = 'n1' contenteditable=true> Content one</div>
<div id = 'n2' contenteditable=true> Content 2</div>
<div id = 'n3' contenteditable=true> Content 3</div>
<div id = 'n4' contenteditable=true> Content 4</div>
Run Code Online (Sandbox Code Playgroud)
JS代码
$('#main div').keydown(function(){
if(!$(this).text().trim()){
$(this).prev().focus();
//setCursorToEnd(this.prev())
}
});
function setCursorToEnd(ele)
{
var range = document.createRange();
var sel = window.getSelection();
range.setStart(ele, 1);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
ele.focus();
}
Run Code Online (Sandbox Code Playgroud) 我需要在JavaScript中每次击键后更新一个可信的P元素的innerHTML
(没有jQuery)
我不能使用输入或textarea而不是P元素.
它工作正常,但是当重置innerHTML时,插入符号始终返回到段落的开头.
我尝试使用其他SO问题的解决方案来讨论插入符号和满足,但它似乎在我的情况下不起作用:我想在更新innerHTML之前将插入符号准确地放回原处.
p.oninput=function(){
// Get caret position
c = window.getSelection().
getRangeAt(0).
startOffset;
console.log(c);
// Update innerHTML
p.innerHTML = p.innerHTML.toUpperCase();
// Place caret back
// ???
}Run Code Online (Sandbox Code Playgroud)
p{ border: 1px dotted red }Run Code Online (Sandbox Code Playgroud)
<p contenteditable id=p>type hereRun Code Online (Sandbox Code Playgroud)
顺便说一句,它不需要在IE上工作,但如果你有一个跨浏览器的解决方案,我也会接受它.
谢谢你的帮助!