Javascript对象准备好了吗?

Javascript对象准备好了吗?,javascript,Javascript,我有一个函数,它使用AJAX从php脚本中获取项目列表,并可以传递过滤器。用户可以通过从页面上的下拉框中选择来设置过滤器 我遇到的问题是,我在页面加载期间调用该函数以使用默认数据填充表单,而当我尝试从下拉框中读取筛选文本时,该函数只是默默退出。它在页面加载后可以正常工作,但在加载期间不能正常工作。但是,如果我在尝试从下拉列表中读取数据之前发出警报(“测试”),那么函数可以正常工作,因此我假设在调用函数时下拉列表没有正确完成加载。我如何测试阅读是否安全,以便在不安全的情况下提供自己的默认值 代码S

我有一个函数,它使用AJAX从php脚本中获取项目列表,并可以传递过滤器。用户可以通过从页面上的下拉框中选择来设置过滤器

我遇到的问题是,我在页面加载期间调用该函数以使用默认数据填充表单,而当我尝试从下拉框中读取筛选文本时,该函数只是默默退出。它在页面加载后可以正常工作,但在加载期间不能正常工作。但是,如果我在尝试从下拉列表中读取数据之前发出警报(“测试”),那么函数可以正常工作,因此我假设在调用函数时下拉列表没有正确完成加载。我如何测试阅读是否安全,以便在不安全的情况下提供自己的默认值

代码Snippit:

var ProdCat = document.getElementById("prod_cat2");             
var Filter = "All Products";

Filter = ProdCat.options[ProdCat.selectedIndex].text;

alert("test");

xr2.open("GET","hs_shop.php?ajaxreq&r=prodlist&p1=" + Filter, true);
xr2.send();

因此,上面的代码在一个名为onLoad的函数中,警报根本不会触发。但如果我注释掉Filter=ProdCat.(etc)行,则会触发警报。即使在页面加载后使用该行,也始终会触发警报。正在寻找一个解决方案,以保持一个功能在加载期间和之后,谢谢

检查是否可以找到该元素。如果不是,则使用默认过滤器“所有产品”

var ProdCat = document.getElementById("prod_cat2");             
var Filter = "All Products";

if (ProdCat)
{
  Filter = ProdCat.options[ProdCat.selectedIndex].text;
}

alert("test");

xr2.open("GET","hs_shop.php?ajaxreq&r=prodlist&p1=" + Filter, true);
xr2.send();

检查是否可以找到该元素。如果不是,则使用默认过滤器“所有产品”

var ProdCat = document.getElementById("prod_cat2");             
var Filter = "All Products";

if (ProdCat)
{
  Filter = ProdCat.options[ProdCat.selectedIndex].text;
}

alert("test");

xr2.open("GET","hs_shop.php?ajaxreq&r=prodlist&p1=" + Filter, true);
xr2.send();

听起来脚本位于HTML文件中
ProdCat
select框的标记上方。如果是这样,最简单的方法就是将包含它的
脚本
标记向下移动,使其位于选择框的标记下方。在解析其标记之前,选择框将不存在,但一旦被解析,它将立即存在

我如何测试阅读是否安全,以便在不安全的情况下提供自己的默认值

如果不想重新定位脚本(或者在其他没有意义的情况下遇到这种情况),可以测试是否获得了元素:

if (ProdCat) {
    Filter = ProdCat.options[ProdCat.selectedIndex].text;
}
如果愿意,您甚至可以让它重试:

var ProdCat;
var Filter = "All Products";

function startAjax() {
    ProdCat = document.getElementById("prod_cat2");
    if (ProdCat) {
        Filter = ProdCat.options[ProdCat.selectedIndex].text;
        xr2.open("GET","hs_shop.php?ajaxreq&r=prodlist&p1=" + Filter, true);
        xr2.send();
    else {
        setTimeout(startAjax, 100); // 1/10th of a second later, try again
    }
}

startAjax();

更新:您在评论中说:

错误是:
ProdCat.options[ProdCat.selectedIndex]未定义

好的,您已经有了元素,但是还没有选择任何内容。因此,测试将是:

if (ProdCat &&                              // We have the select
    ProdCat.selectedIndex >= 0 &&           // and it has a selected value
    ProdCat.options[ProdCat.selectedIndex]  // (Paranoia) and that option exists
    ) {
    Filter = ProdCat.options[ProdCat.selectedIndex].text;
}

听起来脚本位于HTML文件中
ProdCat
select框的标记上方。如果是这样,最简单的方法就是将包含它的
脚本
标记向下移动,使其位于选择框的标记下方。在解析其标记之前,选择框将不存在,但一旦被解析,它将立即存在

我如何测试阅读是否安全,以便在不安全的情况下提供自己的默认值

如果不想重新定位脚本(或者在其他没有意义的情况下遇到这种情况),可以测试是否获得了元素:

if (ProdCat) {
    Filter = ProdCat.options[ProdCat.selectedIndex].text;
}
如果愿意,您甚至可以让它重试:

var ProdCat;
var Filter = "All Products";

function startAjax() {
    ProdCat = document.getElementById("prod_cat2");
    if (ProdCat) {
        Filter = ProdCat.options[ProdCat.selectedIndex].text;
        xr2.open("GET","hs_shop.php?ajaxreq&r=prodlist&p1=" + Filter, true);
        xr2.send();
    else {
        setTimeout(startAjax, 100); // 1/10th of a second later, try again
    }
}

startAjax();

更新:您在评论中说:

错误是:
ProdCat.options[ProdCat.selectedIndex]未定义

好的,您已经有了元素,但是还没有选择任何内容。因此,测试将是:

if (ProdCat &&                              // We have the select
    ProdCat.selectedIndex >= 0 &&           // and it has a selected value
    ProdCat.options[ProdCat.selectedIndex]  // (Paranoia) and that option exists
    ) {
    Filter = ProdCat.options[ProdCat.selectedIndex].text;
}

AJAX是异步的。任何依赖于返回内容的操作都必须在回调函数中完成,而不是在主线代码中。我几乎不敢相信它会默默失败。看看你的错误控制台!Javascript是单线程的。因此,在浏览器执行完启动代码并等待事件发生之前,回调函数不会运行。Barmar:这不是取决于中断的返回位,而是读取筛选器值以调用请求。伯吉:完全正确!很抱歉,我正在同时开发js和php,当我陷入困境时,php退出并显示错误,有时我忘记了js没有!错误是:ProdCat.options[ProdCat.selectedIndex]未定义AJAX的可能副本是异步的。任何依赖于返回内容的操作都必须在回调函数中完成,而不是在主线代码中。我几乎不敢相信它会默默失败。看看你的错误控制台!Javascript是单线程的。因此,在浏览器执行完启动代码并等待事件发生之前,回调函数不会运行。Barmar:这不是取决于中断的返回位,而是读取筛选器值以调用请求。伯吉:完全正确!很抱歉,我正在同时开发js和php,当我陷入困境时,php退出并显示错误,有时我忘记了js没有!错误是:ProdCat.options[ProdCat.selectedIndex]是未定义的,如果(ProdCat)似乎不是有效的测试,则可能是重复的,即在那里使用您的测试代码,Filter=blah行仍会激发并返回未定义的error@DavidBurford:刚刚看到您在注释中输入的错误消息,并更新了.if(ProdCat)似乎不是有效的测试,即在那里使用测试代码,Filter=blah行仍然激发并返回未定义的error@DavidBurford:刚刚看到您在评论中输入的错误消息并进行了更新。