1

私はこの質問をここで何度も見てきましたが、さまざまな答えがあります。このコードは、JQuery 1.5.1 から 1.9.1 に移行したときに機能しなくなりました。

$.ajax(
    {
        type: 'GET',
        url: MapPath($(this).attr('path')),
        cache: false,
        data: '{}',
        dataType: 'html',
        success: function (result) {
            result = $.parseHTML(result);

            $('#dialog').html(result);
            $('#dialog').dialog('open');
            }
        }
    });

結果には、src 属性を持つ JavaScript ファイルへのリンクが含まれます。#dialog コンテナーに追加された後、ロードされて実行されたスクリプトをアップグレードする前に。今はそうではありません。1 つの提案から、parseHTML() メソッドの後にこれを試しました。

$.getScript("/myscript.js");

それは完全に機能しますが、それは私が望むものではありません。ロード コンテナーは、ロードされたコンテナーについて何も知る必要はありません。読み込まれたコンテナにスクリプト インクルードが必要な場合は、コンテナの読み込み時にそのスクリプトを実行する必要があります。

スクリプト要素を見つけてから eval() するという提案を試みました。しかし、いったん parseHTML() すると、スクリプトはもう存在しません。parseHTML() を使用する必要がある理由については、他の質問を参照してください。

こういったことが関係しているのかもしれません。

4

2 に答える 2

1

ブラウザーがスクリプトを処理する方法が原因で、html を使用してスクリプトをロードすることから始めるのは安全ではありません (html を操作する準備が整う前または後に、一貫性のない実行が行われる可能性があります)。代わりに、後でスクリプトをロードできるように文字列を解析します。

$.ajax({
    type: 'GET',
    url: MapPath($(this).attr('path')),
    cache: false,
    success: function (result) {
        result = result.replace(/<script/ig, '<div class="i-script"')
                       .replace(/<\/script/ig, '</div');
        result = $.parseHTML(result);
        var scripts = $(result).find('.i-script').addBack().filter('.i-script').detach();
        $('#dialog').html(result);
        scripts.each(function(i,script){
            $.getScript($(script).attr('src'));
        });
        $('#dialog').dialog('open');
    }
});

明らかに、上記のコードは外部スクリプトでのみ機能しますが、インラインでも機能するように簡単に変更できます。

于 2013-05-08T18:18:28.280 に答える
0

load() jQuery 機能を使用してみませんか。このメソッドは、ロード中のコンテンツにある Javascript も実行します。

$(container).load(src, function(response, status, xhr) {
  if (status == "error") {
    alert(xhr.status + " | " + xhr.statusText);
  }
});
于 2013-05-08T18:28:55.387 に答える