jQueryUI Dialog + Firefox + ASP.Net =访问严格模式调用函数被审查

时间:2013-01-26 03:34:14

标签: jquery asp.net postback jquery-ui-dialog

我有一个在IE和Chrome中运行良好的页面,但在Firefox和Opera中不起作用。当我说它不起作用时,我的意思是Submit按钮根本不做任何事情。它是一个页面上有几个嵌套的UpdatePanels,还有几个jQueryUI Accordions。

我有一个简单的div

<div id="date-dialog" title="Date?">
    <label id="lblDate" for="txtDate">
        Please Enter Your The Date:
    </label>
    <input type="text" id="txtDate" class="text ui-widget-content ui-corner-all" />
</div>

然后我有一些简单的代码将它变成一个对话框:

$('#date-dialog').dialog({
    autoOpen: false,
    modal: true,
    resizable: false,
    buttons: {
        "Submit": function () {
            __doPostBack('DateButton', $('#txtDate').val());
        },
        "Cancel": function () {
            $(this).dialog("close");
        }
    }
});

$('#txtDate').datepicker({ dateFormat: 'yy-mm-dd' });

我也试过添加这个,这没有帮助,实际上不适用于模态对话框:

    open: function (type, data) {
        $(this).parent().appendTo("form");
    },

在Firefox中,我收到以下错误:

Error: TypeError: access to strict mode caller function is censored
Source File: http://ajax.microsoft.com/ajax/4.0/2/MicrosoftAjaxWebForms.debug.js
Line: 718

我不知道如何解决这个问题。我很想关掉strict mode,但我找不到任何关于如何做到这一点的信息。我几乎无法使用Google找到有关该错误的任何信息。看起来我正在做的事情应该很简单。

6 个答案:

答案 0 :(得分:28)

这是一个很老的帖子,但今天我仍然遇到这个问题。 我不想使用按钮的单击,所以我尝试了setTimeout,它也有效。

对于遇到此问题的人,请尝试以下解决方案:

setTimeout(function() { __doPostBack('DateButton', $('#txtDate').val()); }, 1);

答案 1 :(得分:4)

最近不得不解决这个问题,我发现我可以解决问题,让__doPostBack在Edge,IE,Chrome&amp; FireFox将以下脚本添加到我的应用程序顶部。

    if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1) { window.event = {}; }    

使用 SetTimeout 功能会破坏Edge。只需输入 window.event = {} 即可破坏IE。

答案 2 :(得分:1)

虽然这实际上并没有解释如何解决问题,但这是一种解决方法。

我创建了一个对应于对话框中每个字段的隐藏字段。然后我创建了一个按钮。这些必须保留在对话框div之外,因为当div被转到对话框时,$('#date-dialog').dialog({ autoOpen: false, modal: true, resizable: false, buttons: { "Submit": function () { $('#<%=hfDate.ClientID %>').val($('#txtDate').val()); $('#<%=btnFormSubmit.ClientID %>').click(); $(this).dialog("close"); }, "Cancel": function () { $(this).dialog("close"); } } }); 被移动到表单外部。然后我修改了我的对话框创建代码,如下所示:

{{1}}

答案 3 :(得分:1)

适用于IE,Chrome和Firefox。浏览器!,感谢https://mnaoumov.wordpress.com/2016/02/12/wtf-microsoftajax-js-vs-use-strict-vs-firefox-vs-ie/

function hackEventWithinDoPostBack() {
var originalEventDescriptor = Object.getOwnPropertyDescriptor(Window.prototype, "event");
    var hackEventVariable = false;
    var eventPropertyHolder;
    Object.defineProperty(window, "event", {
        configurable: true,
        get: function get() {
            var result = originalEventDescriptor ? originalEventDescriptor.get.apply(this, arguments) : eventPropertyHolder;
            if (result || !hackEventVariable)
                return result;
            return {};
        },
        set: function set(value) {
            if (originalEventDescriptor)
                originalEventDescriptor.set.apply(this, arguments);
            else
                eventPropertyHolder = value;
        }
    });
    var originalDoPostBack = window.__doPostBack;

    window.__doPostBack = function hackedDoPostBack() {
        hackEventVariable = true;
        originalDoPostBack.apply(this, arguments);
        hackEventVariable = false;
    };
}

hackEventWithinDoPostBack();

答案 4 :(得分:0)

这在Firefox Quantum中发生了。我使用的是jQuery 3.x CDN,我必须下载它才能在项目中本地引用它。之后,我对其进行了编辑(jquery.3.x.min.js)并注释/删除了以下内容:

"use strict";

我必须执行search才能全部删除。有两个。

答案 5 :(得分:0)

这可能是个好消息,但我无法在最新的 Firefox 84.0.2 和 jQuery 3.5.1 中复制该问题。我测试了报告的场景以及与“严格使用”规则相关的其他 __doPostBack 有问题的场景,所有这些场景似乎都没有任何 JS 错误。

使用最新的 jQuery 3.5.1 和最新的 Firefox 84.0.2 是否仍然遇到此问题?

还有来自 jQuery 团队的官方声明,但它是旧的,适用于 jQuery 1.9.1,但不适用于 3.5.1 - https://bugs.jquery.com/ticket/13335

谢谢!