0

这段代码在 Opera 12 中运行起来非常奇怪。 元素只是ul,这就是 Firefox 和 Chrome 返回的内容。
在 Opera 中$(this).parent()正在返回Window对象。

有任何想法吗?jQuery 版本是 1.7.2

JS
    $('.addTrait').live('click', function(e) {
        e.preventDefault();
        trait = $('li.trait.template').clone().removeClass('template');
        parent = $(this).parent();
        $(parent).after(trait);
        trait.show();
    });


HTML
<ul class="sortable traits">
    <li class="trait">
    <div class="well slim">
        <input class="trait name" type="text" name="trait[%s][name]" value=""/>
        <input class="trait id" type="hidden" name="trait[%s][id]" value=""/>
        <input class="trait parent" type="hidden" name="trait[%s][parent]" />
        <a href="" class="addTrait icon-plus"></a>
        <a href="" class="removeTrait icon-remove"></a>
    </div>
    <ul>
    </ul>
    </li>
</ul>
<li class="trait template" style="display: none;">
    <div class="well slim">
    <input class="trait name" type="text" name="trait[%s][name]" value=""/>
    <input class="trait id" type="hidden" name="trait[%s][id]" value=""/>
    <input class="trait parent" type="hidden" name="trait[%s][parent]" />
    <a href="" class="addTrait icon-plus"></a>
    <a href="" class="removeTrait icon-remove"></a>
    </div>                
    <ul>
    </ul>
</li>
4

2 回答 2

1

正如@raina77ow 在评论中指出的那样,您需要将其定义parent为局部变量。Opera 禁止更改parent全局对象(为了安全起见,各种插件会查看各种内容以检查它们运行的​​来源,但不可避免地覆盖parent会破坏这一点)。

于 2012-10-04T12:47:07.263 回答
1

请养成将变量声明为本地变量的习惯。它不仅用于修复此类错误,还用于性能优化。以这两个片段为例:

function foo() {
  function bar() {
    var someUrl = 'http://example.com';
    $.getJSON(someUrl, function() { ... };
  }
}

function foo() {
  function bar() {
    someUrl = 'http://example.com';
    $.getJSON(someUrl, function() { ... };
  }
}

如您所见,在两个片段中,JSsomeUrl在调用$.getJSON.

在第一个中,这个变量被声明为bar函数的局部变量,因此它的查找将非常快。

但是,在第二个中,这个变量名实际上是指全局 ( window) 对象的一个​​属性。但是 JS 不知道这一点:它仍然必须一直沿作用域链向上 - 只是为了失败并回退到访问window.someUrl

当然,在处理一个或两个变量时,差异(通常)可以忽略不计。但通常有几十个,并且这种不断向上移动范围链(并最终诉诸属性访问)可能会对脚本的性能产生巨大影响。

于 2012-10-04T13:40:25.257 回答