【问题标题】:JavaScript functions give errors when loaded via AjaxJavaScript 函数在通过 Ajax 加载时会出错
【发布时间】:2011-10-08 09:55:38
【问题描述】:

编辑: 好的,我相信我已经使用@ManseUK 发布的信息以及@Johan 的评论找到了解决此问题的方法。作为一个 n00b,我无法回答我自己的问题,但我在问题下方添加了一个解释,以防它帮助其他人。

我正在重写一个电子商务解决方案的一部分,该解决方案由 几年前的另一个开发团队。在新版本中,我们 尝试使用 Ajax 缩短用户旅程,但这样做 给出 JavaScript 错误并导致某些函数失败。开发网址是 这里:

http://cognition.thelightbulb.co.uk/type-18/general-purpose-lamps-and-bulbs/craftlight-daylight

一旦选择了下拉菜单并且 产品展示。

错误在 IE7 中最为明显:

Error: 'frm.qty' is null or not an object
Error: 'qty.value' is null or not an object

我相信这就是问题所在:

var frm = document.frmOrder; 
var qty = frm.qty;

在上面的行中,frmOrder 是表单的名称,qty 是 产品数量的输入名称。

将其与 http://cognition.thelightbulb.co.uk/product-54 进行比较,其中 产品在没有 Ajax 选择过程的情况下加载,您将看到 功能正常工作。

我怀疑问题与var frm = document.frmOrder; 无法正常工作有关,因为它与 使用 Ajax 加载时的 DOM。

我使用innerHTML=xmlhttp.responseText 作为Ajax 方法。是 有另一种方法来定义 var frm 以便它能够运行 加载 Ajax 时是否正确?

编辑: 使用@ManseUK 发布的信息以及@Johan 的评论,我向CheckMinQty(minorder) 添加了另一个参数,所以它现在看起来像这样......

function CheckMinQty(minorder,qty)

...qtyonclick 事件中作为 document.forms['frmOrder'].qty.value 传递给函数

然后我将整个函数移到一个单独的 .js 文件中。这可能不是最好的方法,但 Ajax 调用仍然感觉更整洁,只返回 CheckMinQty 可以使用的可用 HTML,而不是引入整个负载 <script> 然后尝试运行它。

感谢所有建议,我欢迎任何有关上述方法/解决方案的 cmets。

【问题讨论】:

    标签: php javascript ajax dom


    【解决方案1】:

    改变这个

    var frm = document.frmOrder; 
    

    到这里

    var frm = document.forms['frmOrder']; 
    

    这将为您提供表单的句柄

    【讨论】:

    • 感谢@ManseUK 的建议,但页面加载时我仍然收到Error: 'frm.qty' is null or not an object
    【解决方案2】:

    document.frmOrder 指的是页面上id为frmOrder的元素,恰好是这个页面上的表单。只需尝试在那里获取正确的表单元素作为变量。

    【讨论】:

    • 谢谢@Johan,脚本在这里工作正常:cognition.thelightbulb.co.uk/product-54 所以我认为我有正确的表单元素。这只是使其与 Ajax 一起工作的一个案例
    • 好的,我看你先设置frm-variable(页面刚加载完的时候),然后在点击的时候执行函数。不要过早设置frm-variable,需要的时候获取即可。不是最好的解决方案,但应该可以。
    【解决方案3】:

    虽然 Manse 的解决方案可能有效,但请使用更明智的方式并为表单分配一个 id,因为无论如何您都在使用 jQuery,所以使用 var frm = $(#formid); 检索表单不仅更容易编写,而且更容易供您和其他人阅读。

    【讨论】:

      【解决方案4】:

      通过 AJAX 加载脚本时,您不再有 DOMReady 事件。换句话说,当您想在 AJAX 加载时执行脚本时,您应该使用自调用函数。 将您的 ajax 加载脚本包装在这样的函数中:

      (function(){
          // Do what you want to do here.
      })();
      

      看看能不能解决问题?

      【讨论】:

      • 感谢@Saeed,这似乎防止了页面加载时出现任何错误。 'CheckMinQty(minorder)' 仍然失败。我猜这是因为它使用了qty.value。 'function CheckMinQty(minorder)' 是否应该位于自调用函数之外?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2016-04-16
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多