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

Posted

技术标签:

【中文标题】jQueryUI Dialog + Firefox + ASP.Net = 对严格模式调用函数的访问被审查【英文标题】:jQueryUI Dialog + Firefox + ASP.Net = access to strict mode caller function is censored 【发布时间】:2013-01-10 02:41:31 【问题描述】:

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

我有一个简单的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 找到有关该错误的任何信息。看来我做的应该很简单。

【问题讨论】:

我已经为此创建了一个bug report。 【参考方案1】:

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

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

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

【讨论】:

在 Firefox 46 和 bootbox.confirm() 回调中遇到了这个问题。添加上面的 setTimeout 将其固定在 jiff 中。谢谢。 Firefox 58.0.2 也是如此。有什么影响 - 为什么这甚至有效?更新:我在这里找到了一些关于为什么这有效的信息:***.com/a/36867843/12919【参考方案2】:

最近不得不解决这个问题,我发现我可以通过将以下脚本添加到我的应用程序顶部来解决问题并让 __doPostBack 在 Edge、IE、Chrome 和 FireFox 中工作。

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

使用 SetTimeout 函数会中断 Edge。仅仅放入 window.event= 就破坏了 IE。

【讨论】:

在我的经验中绝对有效,而且是最简单的修复方法。谢谢!【参考方案3】:

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

我创建了一个隐藏字段,对应于对话框中的每个字段。然后我创建了一个按钮。这些必须保留在对话框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");
        
    
);

【讨论】:

我突然看到同样的问题(不知道为什么,以前也有)。正如您在问题中提到的,__doPostBack('DateButton', ''); 背后的 javascript 代码会引发错误。将其更改为$('#&lt;%=DateButton.ClientID %&gt;').click();,它又可以工作了……在我看来,这就像 ASP.NET JavaScript 中的一个错误。【参考方案4】:

这适用于 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();

【讨论】:

你应该相信这篇文章的原始来源,即mnaoumov.wordpress.com/2016/02/12/…【参考方案5】:

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

"use strict";

我必须通过search 将它们全部删除。有两个。

【讨论】:

【参考方案6】:

这可能是个好消息,但我无法在最新的 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。

谢谢!

【讨论】:

以上是关于jQueryUI Dialog + Firefox + ASP.Net = 对严格模式调用函数的访问被审查的主要内容,如果未能解决你的问题,请参考以下文章

jquery中的dialog()方法是怎么使用。我引入了dialog.js。

JQueryUI Dialog插入文本的方式

JQueryUI确认框 confirm

优化jQueryUI中的功能

django admin jQueryUI对话框

用jquery-ui的dialog做对话框