Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
jqueryautopostback问题_Jquery_Asp.net 3.5 - Fatal编程技术网

jqueryautopostback问题

jqueryautopostback问题,jquery,asp.net-3.5,Jquery,Asp.net 3.5,我正在处理ASP.NET 3.5网站项目,并使用jQuery警告用户是否修改了页面并试图在不保存的情况下离开该页面,因此执行如下操作: var warning = "Please save changes you made."; var isDirty = false; $(document).ready(function() { $('input:text,input:checkbox,input:radio').bind('change', function()

我正在处理ASP.NET 3.5网站项目,并使用jQuery警告用户是否修改了页面并试图在不保存的情况下离开该页面,因此执行如下操作:

var warning = "Please save changes you made.";
var isDirty = false;

$(document).ready(function()
{

      $('input:text,input:checkbox,input:radio').bind('change', function()
      {

            isDirty = true;

            $('input[type=submit]').bind('click', function(e)
            {

                isDirty = false;
            });

            window.onbeforeunload = function()
            {

                if (isDirty)
                {

                    return warning;
                }
            }
        });
    });
它工作正常,但当我在页面上进行更改,然后在页面下拉列表中选择另一项,从而导致回发时,我会收到一个警告,我不应该这样做。在jQuery中实现此功能是否可行,即对确实离开页面发出警告,但忽略回发,在这种情况下,我需要对脚本进行哪些更改

好的,我稍微修改了脚本,创建了一个隐藏字段来保存回发之间的脏状态,所以看起来像这样:

 var warn_on_unload = "Leaving this page will cause any unsaved data to be lost.";
 var previouslyDirty = false;
 var isDirty = false;

 $(window).load(function()
 {

    previouslyDirty = $('#dirtyFlag').val() == '1';

 });

 $(window).unload(function()
 {

        $('#dirtyFlag').val(previouslyDirty ? '1' : '0');
 });

 $(document).ready(function()
 {

        $('input:checkbox,input:radio').one('change', function()
        {

            isDirty = true;

            previouslyDirty = true;

        });



        $('input:text, textarea').keydown(function()

        {

            isDirty = true;

            previouslyDirty = true;

        });

        $('form').submit(function(e)
        {

            isDirty = false;

            previouslyDirty = false;

        });

        $('select').bind('change', function(e)
        {

            isDirty = false;

            previouslyDirty = true;

        });

        window.onbeforeunload = function()
        {

            if (isDirty || previouslyDirty)
            {

                return warn_on_unload;

            }
        }

    });

在未提交回发后仍然表现不正确,这应该允许它们在没有警告的情况下,但保存脏状态,所以如果我更改下拉列表,回发没有问题,但如果我尝试在之后离开页面,应该会收到警告。此外,需要注意提交回发,即保存按钮,显然允许它们并清除以前设置的所有脏标志。

您是否尝试捕获表单的提交事件?(不是单击提交按钮,而是实际提交)

也许这能解决问题

$('form').submit(function(){isDirty = false;});

除非正常链接也提交表格

像这样的怎么样

$(window).unload(function(event)
{
  if (event.target.nodeName != "SELECT" && event.target.nodeName != "INPUT" ) {
    $('#dirtyFlag').val(previouslyDirty ? '1' : '0');
  }
});
​

如果这不起作用,您能告诉我在各种情况下调用的
event.target.nodeName
是什么吗?

因为我们已经有了jQuery,所以我们使用它来检测表单是否已更改,如此问题的可接受答案所示

此外,我们知道webforms页面只有一个表单。Webforms在通过链接处理回发时调用form.onsubmit()和form.submit()

要跨自动回发事件跟踪原始序列化值,请将序列化表单数据存储在隐藏字段中

<asp:HiddenField id="serializedForm" runat="server" />

$(document).ready(function(){

    var theform = $('form');
    var serialized = theform.serialize();
    var previous = null;

    // track original serialized across postbacks
    var hidden = $('#<%# serializedForm.ClientID %>');
    if ('' == hidden.val()) {
        serialized = hidden.val();
    } else {
        hidden.val( serialized );
    }

    window.onbeforeunload = function(e) {
        if (serialized != theform.serialize()) {
            return "Are you sure you want to leave the page without saving?";
        }
    }

    // postback -> __doPostBack -> form.onsubmit -> here
    theform.submit(function(){
        // keep in case of validation fail
        previous = serialized;

        // prevent the onbeforeunload prompt
        serialized = theform.serialize();
    });

    // there might be ASP.NET validators
    if (typeof(ValidatorOnSubmit) == "function") {
        var asp_ValidatorOnSubmit = ValidatorOnSubmit;
        ValidatorOnSubmit = function() {
            var result = asp_ValidatorOnSubmit.apply( arguments );
            if (!result) {
                serialized = previous;
            }
            return result;
        }
    }

});

$(文档).ready(函数(){
var theform=$('form');
var serialized=theform.serialize();
var-previous=null;
//跨回发跟踪序列化的原始文件
var hidden=$(“#”);
如果(“”==hidden.val()){
serialized=hidden.val();
}否则{
隐藏.val(序列化);
}
window.onbeforeunload=函数(e){
if(serialized!=form.serialize()){
return“您确定要离开页面而不保存吗?”;
}
}
//回发->回发->form.onsubmit->此处
form.submit(函数(){
//保存以防验证失败
先前=序列化;
//阻止onbeforeunload提示
serialized=格式为.serialize();
});
//可能存在ASP.NET验证程序
if(类型(ValidatorOnSubmit)=“函数”){
var asp_ValidatorOnSubmit=ValidatorOnSubmit;
ValidatorOnSubmit=函数(){
var result=asp_ValidatorOnSubmit.apply(参数);
如果(!结果){
序列化=先前;
}
返回结果;
}
}
});

谢谢您的回复。没有,我没有试过。问题是我们使用母版页,而这是一个内容页,所以没有表单名Yes。。但是有一个表单标签,对吗?(一个)。上面的代码附加到表单标签上。事实上,不,页面内容完全在内容标签内。母版页没有一个表单标签吗?啊,你的意思是在母版页上,是的,我会尝试一下。谢谢回复。event.target.nodeName的值始终是“#document”,因为我把它放在母版页上,这让人惊讶。我使用ASP.NET已经有很长时间了,但我认为母版页的最终结果也是HTML。因此,如果SELECT(自动回发)上存在事件,浏览器将始终知道事件的正确来源。我可以建议的下一件事是,所有回发都是通过一个名为
\uu doPostBack
的函数触发的。你也许可以用它做点什么。我可能很笨,但上面提到的下拉菜单到底是做什么的呢?@Adam。该特定下拉列表会更改外键值。但这是一个更广泛的问题,因为我有各种各样的非提交按钮、下拉列表、向导按钮等,它们会导致回发,并且我不能在任何一个按钮上发出警告,只有当用户永久离开页面时。好吧,这并不是一个特殊的“答案”,更像是一个想法:导航到其他网站或关闭页面必须有不同的“代码”然后更改某个值,所以虽然两者都调用卸载,但肯定有不同的内容。。。也许可以和firebug联系一下?谢谢回复。我不知道这如何处理未提交的回发,也就是说,一旦我更改了某些内容,我将无法在没有警告的情况下执行任何导致回发的操作。是的,始终只有一个表单,它将在母版页上运行。但我不认为我们可以使用这种方法。在做了一些更改后单击“保存”提交按钮后,我应该能够在没有警告的情况下关闭页面,因为我刚刚保存了更改。我上面的代码处理了这个场景。@Victor我简化了我的脚本little@Lachlan. 是的,请看我的评论above@Victor您正在进行ajax保存?