【问题标题】:JavaScript executes only if I add a breakpoint in it in Firebug or Chrome developer tools仅当我在 Firebug 或 Chrome 开发人员工具中添加断点时,JavaScript 才会执行
【发布时间】:2012-09-13 18:18:34
【问题描述】:

我正在使用 asp.net、JavaScript 和 HTML 处理程序。

在一个 asp 按钮 onclick 事件中,我像这样调用 JavaScript。

<asp:Button ID="btn_Tagging" CssClass="button" UseSubmitBehavior="false"
     Text="Done" OnClientClick="DoneClick()" />

在脚本标记内的同一页面中,我编写了这样的 JavaScript:

<script type="text/javascript">
function DoneClick()
{
   var checkLocation = "";
   var txtMM = document.getElementById("hdn_Tagging").value;///Id s of textbox assigned in code behind MB--
   txtMM = txtMM.slice(0, -1);
   var arrTxtMM = txtMM.split(",");
   for(var j=0;j<arrTxtMM.length;j++)
   {
      var Loc = document.getElementById(arrTxtMM[j]).value;
      if(Loc == "")
      {
         checkLocation = "";
         break;
      }
      else
      {
         checkLocation += Loc + ":";
      }
   }
   if(checkLocation != "")
   {
      var url ='Handler/newExifDetails.ashx?Id='+txtMM+'&Location='+checkLocation+'';
      var completetbl, html;
      $.getJSON(url,function(json)
      {
         $.each(json,function(i,weed)
         {
            var res = weed.res;
            alert(res);
            if(res == null)
            {
            }
            else
            {   
               window.top.location.href = "Dashboard.aspx";
            }
          });        
       });

    }
    else
    {
       alert("Please pick the locations for all objects");
    }
 }
</script>

然后,当我单击按钮时,JavaScript 中的警报仅在我在 Firebug 或 Chrome 开发人员工具脚本中放置断点时才会显示,如果我放置断点它可以工作。如果不放置该断点,则警报既不会显示也不会重定向。

【问题讨论】:

  • 这听起来像是那里某处的竞争条件。
  • 重新检查你得到的 JSON 是否正确并且不包含语法错误,如果是这样,那么 $.getJSON 通常会静默失败。还要在重定向条目上放置断点并检查本地变量。可能正在发生一些奇怪的事情。
  • 为什么在这里使用asp:Button控件?你有这个按钮的点击事件的任何服务器逻辑吗?您的问题是回发发生在 $.getJson 函数将结果返回给客户端之前。
  • json 正在工作,就好像我在处理程序中放置了一个断点处理请求,但在 js 中没有任何断点...它转到处理程序,因此调用处理程序...然后将尝试在函数内发出警报检查...
  • 按钮在 html 中看起来像这样......

标签: javascript asp.net


【解决方案1】:

这是一个经典的heisenbug。如果您可以向我们展示按钮在生成的 HTML 代码中的外观,将会有所帮助。您是否尝试使用简单的警报作为点击处理程序?您是否尝试在 JavaScript 中动态添加处理程序?

尝试添加:

$('#btn_Tagging').click(DoneClick);

或:

$(function() { $('#btn_Tagging').click(DoneClick); });

在您的 JavaScript 代码末尾并删除:

OnClientClick="DoneClick()"

来自 ASP。

我假设生成的 HTML 按钮获得了“btn_Tagging”的id - 我正确吗?如果它不起作用,那么不要向我们展示您的 ASP 代码,而是向我们展示生成的 HTML,它会进入浏览器,最重要的是:它的 value 属性是什么。

(另外,由于您已经将 jQuery 用于 AJAX,我建议您也将 jQuery 用于 DOM 操作。这样做更容易出错,而且您没有使用已经加载的库。请参阅this reply 举个例子,如果你不小心,即使getElementById 也很容易引入错误。)

【讨论】:

  • 我已经按照你的说法包含了该行,但是没有断点仍然没有显示警报...我还尝试在函数 DoneClick() 中包含断点我在此行之前收到了所有警报... $.getJSON(url,function(json) 这条线之后的警报没有显示...我没有反应,我也尝试删除 onclientclick 并给出了你提到的行但仍然是 json 行之后的警报行没有执行....可能出了什么问题??
  • 尝试通过JavaScript beautifier 运行您的代码,因为代码的缩进使得在某些地方发生的事情变得不那么明显。在 $.getJSON 处理函数的开头(就在 $.each(...) 之前)放置一个警报 - 或者更好的是 console.dir(json);,以查看您的 AJAX 调用是否成功以及它实际返回的内容。
  • 我尝试了你提供的链接并让 js 对齐,然后我在 $.getJSON 之后和 $.each() 之前添加了警报我没有得到那个警报......控制台也没有.dir(json) 在那里工作....但是如果我通过在 fire bug 的那个地方放置一个断点来做这个警报和所有工作......所以..调用 json 有什么问题吗??
  • 如果您没有收到警报,则意味着您的 AJAX 调用没有成功,但也可能意味着它甚至没有开始。尝试在$.getJSON之前发出警报,以查看您的代码执行是否到此为止,如果没有,则在if(checkLocation != "") 之前放置警报以查看它是否到达那里。您必须进行一些试验才能找到您的代码没有按照您的预期执行的地方。
  • 我还会在第一个 for 循环之前添加 console.dir(txtMM);console.dir(arrTxtMM);,并在浏览器的控制台中查看这些对象的外观,以确保它们符合您的预期。 (在 Firefox 中,您必须安装 Firebug 才能使 console.dir 工作。)
【解决方案2】:

尝试使用普通的input type="button" 控件而不是asp:Button。或者重写你的按钮如下:

<asp:Button ID="btn_Tagging" CssClass="button" UseSubmitBehavior="false"
     Text="Done" OnClientClick="DoneClick(); return false;" />

问题在于 $.getJSON 函数的异步成熟,所以在它调用之后,执行上下文离开 DoneClick 函数并调用 __doPostBack 函数添加到 btn_Tagging html 控件的 onclick 属性由 asp.net 基础设施。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 2012-04-05
    • 2015-01-07
    • 2011-08-08
    • 1970-01-01
    • 2017-09-13
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多