Javascript 来自jQuery的延迟响应(以及其他一些奇数人工制品)

Javascript 来自jQuery的延迟响应(以及其他一些奇数人工制品),javascript,jquery,Javascript,Jquery,我从jQuery得到了一个令人难以置信的回复,我希望有人能帮助我。我有一个简单的问题。。。在加载表单时,我正在设置HTML表单的隐藏字段(aka,)的“值”。我有一个包含三个隐藏字段的表单,其中两个工作正常。第三个…问题是: 一旦表单完成加载(是的,它已加载且可见……作为前两个隐藏字段已加载并由jQuery成功设置的间接证据),我将运行以下代码(仅显示相关片段,因为最后一个字段的日期设置为“今天”): SetFieldValue是我编写的一个小函数,它允许设置DOM元素,而不管它是什么类型。代码

我从jQuery得到了一个令人难以置信的回复,我希望有人能帮助我。我有一个简单的问题。。。在加载表单时,我正在设置HTML表单的隐藏字段(aka,
)的“值”。我有一个包含三个隐藏字段的表单,其中两个工作正常。第三个…问题是:

一旦表单完成加载(是的,它已加载且可见……作为前两个隐藏字段已加载并由jQuery成功设置的间接证据),我将运行以下代码(仅显示相关片段,因为最后一个字段的日期设置为“今天”):

SetFieldValue是我编写的一个小函数,它允许设置DOM元素,而不管它是什么类型。代码如下:

function SetFieldValue ( domObject, value ) {
  // as a safety function, check if a string representation of the domObject was passed in and convert it to a jQuery object if it was
  if ( jQuery.type(domObject) === "string") {
    domObject = jQuery(domObject);
  }

  if ( jQuery.inArray (domObject.prop('tagName').toLowerCase(),['input' , 'select' , 'textarea']) >= 0 ) {
    console.log ("setting to value attribute: " + value);
    domObject.attr('value',value);
    console.log ("now set to: " + domObject.attr('value') + "(" + domObject.attr('id') + ")" );
  } else {
    console.log ("setting to html attribute");
    domObject.html( value );
  }
  return domObject;
}
请注意console.log消息,因为这对于理解问题的疯狂性很重要。当我运行此操作时,我在控制台上得到的信息如下:

现在我在“today”case语句的最后一行(也就是“break;”行)设置了一个断点。根据控制台消息,一切正常。似乎DOM元素#activity-start_time已经设置好了。这就是奇怪的地方

我要做的第一件事是测试对“targetElement”的引用,调试器控制台给我的第一件事是空数组:

什么?这太奇怪了。当我思考几秒钟过去后,它突然变成了我所期望的(我没有在控制台中重新键入它,它只是从空集变为下面所示):

既然targetElement与我预期的完全一样,我就用jQuery简单检查一下#activity-start_time的DOM元素是否报告了相同的值。您可以看到上面的结果。它与targetElement完全相同,只是没有值。什么

我完全不知所措。任何帮助都将不胜感激


p、 我会注意到,其他人建议使用.prop而不是.attr,两者的行为似乎完全相同。

我知道我没有提供足够的上下文让人们真正深入研究这个问题,但我最终解决了它。问题是什么?真的很傻…不总是吗?总之,这只是一个DOM元素的例子问题“id”不是唯一的。Grrr。总是那些显而易见的事情让你陷入麻烦


无论如何,感谢您的耐心和帮助。

您没有将targetElement转换为jQuery对象
SetFieldValue(targetElement
),但您却进行了日志记录……这似乎有些奇怪,可能会导致代码出现问题。@jeff我不确定您的意思。我在函数顶部检查传递给我的内容是否为“绳子"如果是,则会转换为jQuery对象。在大多数情况下,特别是在本例中,传入的对象已经是jQuery对象。但是如果它是一个未被jQuery查询的DOM对象呢?您似乎在日志中显式地将其包装,但在直接传入时不会。可能/可能不是您的问题,但可能是让您的函数接受一个ID更安全,然后直接在函数顶部的jQuery选择器中选择该ID。这只是一个想法。可能值得在您的==“字符串中添加一些日志记录”块以查看它是否被击中。好的,我这样做了,但它只是验证发送到函数中的对象已经是jQuery对象。可能会感兴趣的是,当稍后再次交互调用该函数时(通过按按钮),但具有完全相同的值…工作正常。我现在正在寻找一个可以从中跳出的高层建筑。^)
function SetFieldValue ( domObject, value ) {
  // as a safety function, check if a string representation of the domObject was passed in and convert it to a jQuery object if it was
  if ( jQuery.type(domObject) === "string") {
    domObject = jQuery(domObject);
  }

  if ( jQuery.inArray (domObject.prop('tagName').toLowerCase(),['input' , 'select' , 'textarea']) >= 0 ) {
    console.log ("setting to value attribute: " + value);
    domObject.attr('value',value);
    console.log ("now set to: " + domObject.attr('value') + "(" + domObject.attr('id') + ")" );
  } else {
    console.log ("setting to html attribute");
    domObject.html( value );
  }
  return domObject;
}