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いるように、ローカル変数として定義する必要があります。Operaparentはグローバルオブジェクトの変更を禁止しています(さまざまなプラグインがセキュリティのために実行されているオリジンをチェックするためにさまざまなものを調べますが、必然的に上書きparentするとそれが壊れます)。

于 2012-10-04T12:47:07.263 に答える
1

変数をローカルとして宣言することを習慣にしてください。このようなバグを修正するだけでなく、パフォーマンスを最適化するためのものでもあります。たとえば、次の 2 つのスニペットを使用します。

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

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

ご覧のとおり、両方のスニペットで、JS は をsomeUrl呼び出すときに式を評価する必要がありました$.getJSON

最初のものでは、この変数はbar関数に対してローカルとして宣言されているため、そのルックアップは非常に高速です。

ただし、2 番目のものでは、この変数名は実際にはグローバル ( window) オブジェクトのプロパティを参照しています。しかし、JS はそれを認識していません。スコープ チェーンをずっと上に移動する必要があります。つまり、失敗してwindow.someUrl代わりにアクセスにフォールバックするだけです。

もちろん、1 つまたは 2 つの変数を扱う場合、違いは (通常) 無視できます。しかし、通常、それらは数十あり、スコープ チェーンをたどる (そして最後にプロパティ アクセスに頼る) ことは、スクリプトのパフォーマンスに劇的な影響を与える可能性があります。

于 2012-10-04T13:40:25.257 に答える