0

我有一个页面,我正在加载一个选择标签,其中包含从 ajax 调用到服务的选项。它工作正常并正确加载选择标签。我只希望这种加载在用户第一次到达页面时发生一次,所以我将调用放在 $(document).ready(function call 中执行此操作的函数。我看到的问题是当用户选择一个选项,然后在某些情况下单击一个按钮我弹出一个对话框(jQuery UI)告诉他们他们需要采取某种行动。第一次发生这种情况,只有第一次选择的选项以某种方式重置为列表中的第一个选项。我在调试中运行了很多次,发现如果这是页面上的第一次,则选择器在到达页面时按预期加载,但如果对话框被弹出,它会再次加载 - 只有第一次 - 之后如果对话框弹出重新加载不会发生,一切都很好。缩写代码:

$(document).ready(function () {
    $.fn.LoadStuff();
});

jQuery.fn.LoadStuff = function () {
    //load up the select tag with options
};

LoadStuff不会在其他任何地方被调用。selOffers 是选择标签,dvConflict 是对话框。他们不共享一个共同的父 div。

<select id="selOffers"></select> 

<div id="dvConflict"><div id="dvConflictMsg" /></div>

用于对话框的 jQuery:

var optSave = {
width: 400,
modal: true,
resizable: false,
draggable: false,
closeOnEscape: true,
zIndex: 1320,
buttons: [
    {
        text: 'Ok',
        click: function () {
            $(this).dialog('close');
        }
    }
]

}

$(".ui-dialog-titlebar").hide(); //Hides the title

$('#dvConflict').css('background', 'none'); //取出我们自定义的背景 $('#dvConflict').dialog(optSave);

4

1 回答 1

1

编辑:两件事

  1. 使用$.LoadStuff = function () { }而不是$.fn.LoadStuff = function () {...}. 第一个是通过在任何上下文中调用$.LoadStuff();。后者将用于元素选择,例如$("div.to-load").LoadStuff();.

  2. $(document).ready每次 DOM 完成加载时都会触发。在某些 AJAX 调用中,您可能正在重新加载 DOM 的一部分或内部框架(我不知道,尽管我没有您的代码)。

    以下代码示例将帮助您绕过该问题:

    var first = true;  
    $(document).ready(function () {  
        if (first) $.LoadStufF();  
        ...    
        first = false;  
    }
    
  3. 打开对话框时,请确保<script>对话框包装元素内没有标签。假设您有代码行:

    $('#dialoged').dialog({ ... });
    

    所以一个不好的做法是:

    <div id="dialoged">
        <script>
             var first = true;  
             $(document).ready(function () {  
                 if (first) $.LoadStufF();  
                     ...    
                 first = false;  
             }
         </script>
    </div>
    
于 2013-08-13T13:44:11.467 回答