0

MVC usercontroll のコンテンツをロードするために JQuery を使用しています。

function menuShowModal(a) {
    $.ajax(
            {
                url: a.href,
                success: function (result) {
                    $('#modalDialog').dialog('close');
                    var $dialog = $('<div id=\'modalDialog\'></div>')
                            .html(result)
                            .dialog({
                                autoOpen: true,
                                title: 'Basic Dialog',
                                modal: true
                            });
                },
                cache: false,
                type: 'get'
            });
    return false;
}

返される HTML は次のようになります。

<input type="text" id="navnet" value="test" />
        
<script type="text/javascript">
    $(document).ready(
    function () {
        alert($("#navnet").val());
    }
    )
</script>

問題は、アラートが「テスト」ではなく「未定義」を返すことです。つまり、HTML が挿入される前に JS が実行されます。これを回避するにはどうすればよいですか?

-- 以下の投稿の解決策はコールバック関数です。ここに作業コードがあります --

function menuShowModal(a) {
    $.ajax(
            {
                url: a.href,
                success: function (result) {
                    onDialogBoxShown = null;
                    $('#modalDialog').dialog('close').remove();
                    var $dialog = $('<div id=\'modalDialog\'></div>')
                            .html(result)
                            .dialog({
                                autoOpen: true,
                                title: 'Basic Dialog',
                                modal: true
                            });
                            if (onDialogBoxShown != null) onDialogBoxShown();
                },
                cache: false,
                type: 'get'
            });
    return false;
}

<input type="text" id="navnet" value="test" />
        
<script type="text/javascript">
    var onDialogBoxShown = function () { alert($("#navnet").val()); }
</script>
4

2 に答える 2

2

ドキュメントはすでに読み込まれているため (挿入するスニペットはドキュメントではありません)、コールバックがすぐに起動します。これを試して:

<script type="text/javascript">
    alert($("#navnet").val());
</script>

または、関数を定義し、html が挿入された後に明示的に呼び出します。

<script type="text/javascript">
    var mycallback = function() { alert($("#navnet").val()); }
</script>

...    

.html(result);
if (typeof window.mycallback == 'function') mycallback();

可能であれば、要素を取り除き、すべてのコードを成功のコールバック<script>に入れることをお勧めします。

于 2010-03-29T10:14:51.550 に答える
0

問題は、dialog() を呼び出すまで、html がメモリ内に浮かび、DOM に追加されないため、ID で要素を見つけることができないことだと思います。

これはうまくいくはずです:

 $('#modalDialog').dialog('close');
 var $dialog = $('<div id=\'modalDialog\'></div>').css('display','none');
 $(document.body).append($dialog);
 $dialog.html(result)
 .dialog({
    autoOpen: true,
    title: 'Basic Dialog',
    modal: true
 });
于 2010-03-29T10:22:27.317 に答える