我想知道,JavaScript提供了各种方法来从任何元素中获取第一个子元素,但哪个是最好的?最好的,我的意思是:大多数跨浏览器兼容,最快,最全面和可预测的行为.我用作别名的方法/属性列表:
var elem = document.getElementById('container');
var child = elem.children[0];
var child = elem.firstElementChild; // == children[0]
Run Code Online (Sandbox Code Playgroud)
这适用于两种情况:
var child = elem.childNodes[0]; // or childNodes[1], see below
Run Code Online (Sandbox Code Playgroud)
这是形式或<div>
迭代的情况.如果我可能遇到文本元素:
var child = elem.childNodes; // treat as NodeList
var child = elem.firstChild;
Run Code Online (Sandbox Code Playgroud)
据我所知,firstChild
使用NodeList childNodes
,并firstElementChild
使用children
.我将这个假设建立在MDN参考上:
childNode
是对元素节点的第一个子元素的引用,或者null
如果没有元素节点的引用.
我猜测,就速度而言,差异(如果有的话)几乎没有,因为firstElementChild
它实际上是一个引用children[0]
,并且children
对象已经在内存中了.
扔我的是childNodes
对象.我用它来查看表格元素中的表单.虽然children
列出了所有表单元素,但childNodes
似乎也包含HTML代码中的空格:
console.log(elem.childNodes[0]);
console.log(elem.firstChild);
Run Code Online (Sandbox Code Playgroud)
两个日志 <TextNode textContent="\n ">
console.log(elem.childNodes[1]);
console.log(elem.children[0]);
console.log(elem.firstElementChild);
Run Code Online (Sandbox Code Playgroud)
所有日志<input type="text" …
我想删除""
一个字符串.
例如,如果String是:"I am here"
那么我只想输出I am here
.
如何在javascript中将另一个字符串的所有实例替换为另一个字符串?例:
someString = 'the cat looks like a cat'
anotherString = someString.replace('cat', 'dog');
Run Code Online (Sandbox Code Playgroud)
导致anotherString设置为' 狗看起来像一只猫 ',我希望它是' 狗看起来像一只狗 '
解决了
关于这个问题,网上有很多矛盾的信息.感谢@John,我设法解决了闭包(如下所示)不是内存泄漏的原因,即使在IE8中 - 它们并不像人们所说的那样普遍.事实上,我的代码中只发生了一次泄漏,事实证明并不难解决.
从现在开始,我对这个问题的回答是:
AFAIK是唯一一次IE8泄漏的时候,就是在全局对象上设置了事件/处理程序.(window.onload
,window.onbeforeunload
,...).要解决这个问题,请参阅下面的答案.
巨大的更新:
我现在已经完全迷失了......经过一段时间深入挖掘新旧文章,我至少留下了一个巨大的矛盾.尽管之一的 JavaScript的大师的(道格拉斯·克罗克福德)说:
由于IE无法完成其工作并重新开始循环,因此我们不得不这样做.如果我们明确地打破循环,那么IE将能够回收内存.根据微软的说法,闭包是造成内存泄漏的原因.这当然是非常错误的,但它导致微软向程序员提供了关于如何应对微软错误的非常糟糕的建议.事实证明,很容易打破DOM端的循环.几乎不可能在JScript端打破它们.
正如@freakish所指出的,我的下面的代码段与jQuery的内部工作类似,我觉得我的解决方案不会导致内存泄漏.与此同时,我找到了这个MSDN页面,该部分Circular References with Closures
对我特别感兴趣.下图几乎是我的代码如何工作的示意图,不是它:
唯一的区别是我的常识是不将我的事件监听器附加到元素本身.
所有相同的Douggie都是非常明确的:闭包不是IE中mem泄漏的根源.这个矛盾使我无法理解谁是对的.
我也发现泄漏问题在IE9中也没有完全解决(找不到链接ATM).
最后一件事:我还得知IE管理JScript引擎之外的DOM,当我<select>
根据ajax请求更改元素的子元素时,这让我感到烦恼:
function changeSeason(e)
{
var xhr,sendVal,targetID;
e = e || window.event;//(IE...
targetID = this.id.replace(/commonSourceFragment/,'commonTargetFragment');//fooHomeSelect -> barHomeSelect
sendVal = this.options[this.selectedIndex].innerHTML.trim().substring(0,1);
xhr = prepareAjax(false,(function(t)
{
return function()
{
reusableCallback.apply(this,[t]);
}
})(document.getElementById(targetID)),'/index/ajax');
xhr({data:{newSelect:sendVal}});
}
function reusableCallback(elem)
{
if (this.readyState === 4 && this.status === 200)
{
var data = JSON.parse(this.responseText);
elem.innerHTML …
Run Code Online (Sandbox Code Playgroud) CSS - 属性pointer-events: none;
在Firefox中运行良好,但在Internet Explorer 9-10中却没有.
有没有办法在IE中实现此属性的相同行为?有任何想法吗?
概括:
好吧,自从我问这个问题以来已经有一段时间了.像往常一样,Object.prototype
无论如何,尽管在网上和网上的其他地方都有反对它的所有有效论据,我还是进行了扩充.我想我就是那种顽固的混蛋.
我试图找出一种结论性的方法来防止新方法破坏任何预期的行为,这被证明是一个非常艰难但信息丰富的事情.
我学到了很多关于JavaScript的东西.至少我不会像在使用本机原型一样轻率地尝试任何东西(除了String.prototype.trim
IE <9).
在这种特殊情况下,我不使用任何库,因此冲突不是我主要关注的问题.但是在使用本机原型时,我已经深入研究了可能的不幸事件,我不太可能将这个代码与任何lib结合使用.
通过研究这种原型方法,我对模型本身有了更好的理解.我将原型作为一种灵活的传统抽象类处理,使我坚持传统的OOP思维.这个观点并没有真正做到原型模型的正义.道格拉斯·克罗克福德(Douglas Crockford)写到了这个陷阱,遗憾的是,粉红色的背景使我无法阅读完整的文章.
我决定更新这个问题,因为读这篇文章的人很想看到自己.我只能这样说:一定要做到.我希望你能像我一样学习一些巧妙的东西,然后再决定放弃这个相当愚蠢的想法.一个简单的函数可能也可以正常工作,甚至更好,尤其是在这种情况下.毕竟,真正的美妙之处在于,通过添加3行代码,您可以使用相同的功能来增强特定对象的原型.
我知道我将问一个已存在很长一段时间的问题,但是:为什么Object.prototype被认为是不受限制的?就在那里,它可以像任何其他原型一样进行扩充.那么,为什么你不应该利用这一点.在我看来,只要你知道你在做什么,就没有理由避开Object原型.
以此方法为例:
if (!Object.prototype.getProperties)
{
Object.prototype.getProperties = function(f)
{
"use strict";
var i,ret;
f = f || false;
ret = [];
for (i in this)
{
if (this.hasOwnProperty(i))
{
if (f === false && typeof this[i] === 'function')
{
continue;
}
ret.push(i);
}
}
return ret;
};
}
Run Code Online (Sandbox Code Playgroud)
基本上,它是一个相同的旧for...in
循环,你要么在一个函数中保持安全,要么一遍又一遍地写.我知道它会被添加到所有对象中,因为几乎JavaScript中的每个继承链都可以追溯到Object.prototype
,但在我的脚本中,我认为它是两个邪恶中的较小者.
也许,有人会在告诉我,我是错的比做得更好这第一章,等等.
在寻找人们没有触及Object
原型的原因的同时,有一件事情不断出现:它打破了for..in
循环,但又一次:许多框架也做了,更不用说你自己的继承链了.因此 …
我在本地计算机上有一个数据库,我想将数据导入到我的主机上的数据库.这两个数据库的是相同的,相同的table names
,column names
等等.
当我export
从我的本地数据库通过表phpmyadmin
和import
它通过phpmyadmin在我的主机上弹出一个错误弹出告诉我有重复的条目,primary key
并停止整个操作.
如何通过phpmyadmin导入数据,跳过重复的条目,并在流程结束时显示重复项的列表?
我可以做的解决方案是在托管中调用db中主键的所有值,并在导入之前过滤重复项.但我想知道phpmyadmin是否有快速解决方案?
请考虑以下PHP代码:
//Method 1
$array = array(1,2,3,4,5);
foreach($array as $i=>$number){
$number++;
$array[$i] = $number;
}
print_r($array);
//Method 2
$array = array(1,2,3,4,5);
foreach($array as &$number){
$number++;
}
print_r($array);
Run Code Online (Sandbox Code Playgroud)
两种方法都完成相同的任务,一种是通过分配引用而另一种是通过基于密钥重新分配来完成.我想在我的工作中使用优秀的编程技术,我想知道哪种方法是更好的编程实践?或者这是其中一个并不重要的事情?
我想在配置文件(config.yml)中添加一个简单的值列表.例如 :
my_bundle:
columns: ["col1", "col2"]
Run Code Online (Sandbox Code Playgroud)
将节点添加到配置解析器时,它只是失败:
$rootNode = $treeBuilder->root('my_bundle');
$rootNode->arrayNode('columns')->children()->end();
Run Code Online (Sandbox Code Playgroud)
这是错误:
InvalidConfigurationException: Unrecognized options "0, 1" under "my_bundle.columns"
Run Code Online (Sandbox Code Playgroud)
我错过了什么?这甚至可能吗?
在过去的几个月里,我一直在学习很多关于JavaScript的知识.多年来一直滥用语言,我敢说我现在对语言有了更好的理解,并且我开始喜欢它的功能性.
最近我接受了学习计划,但这只是为了好玩.浏览MDN引用我注意到JS虽然缺少块作用域,但确实有一个关键字可用于声明给定块的本地变量,就像Scheme的一样let
:
for (var i=0;i<someArray.length;i++)
{
console.log(someArray[i]);
}
console.log(i);//will log someArray's length
Run Code Online (Sandbox Code Playgroud)
鉴于:
for (let i=0;i<someArray.length;i++)
{
console.log(someArray[i]);
}
console.log(i);//undefined
Run Code Online (Sandbox Code Playgroud)
所以我现在想知道的是:为什么不let
经常使用?它与X浏览器支持有关吗?它只是那些鲜为人知的好东西之一吗?
简而言之,使用var
过有let
什么好处,有什么警告?
据我所知,行为let
是,如果有的话,更一致(单个块中的双重声明引发一个TypeError
,除了函数体(ECMA6草稿修复了这个).
说实话,除了这个功能/关键字我不是很了解,我很难想到任何反对使用let
for循环的论据,或者临时变量使代码更易读的地方.