Javascript 将内联代码移动到函数中,并生成对象名
我正在定制丹尼斯·格里奇尤克的Javascript 将内联代码移动到函数中,并生成对象名,javascript,Javascript,我正在定制丹尼斯·格里奇尤克的 此弹出脚本在href链接中使用内联Javascript,将所选日期设置到父窗口中调用的输入字段中。示例URL如下所示: <a href="javascript:window.opener.document.formname.field.value='03-10-2011'; window.close();">3</a> 如何将这些内联命令移动到JS函数中?这将给我更干净的网址和代码。URL现在看起来像 <a hr
href
链接中使用内联Javascript,将所选日期设置到父窗口中调用的输入
字段中。示例URL如下所示:
<a href="javascript:window.opener.document.formname.field.value='03-10-2011';
window.close();">3</a>
如何将这些内联命令移动到JS函数中?这将给我更干净的网址和代码。URL现在看起来像
<a href="javascript:updateField ('document.formname.field', '03-10-2011');">3</a>
那么,您有什么建议可以这样做吗?您不正确地访问了该属性。尝试:
function updateField (str_target, str_datetime) {
var fieldName = window.opener;
str_target = str_target.split('.');
for (var i = 0; i < str_target.length; i++)
fieldName = fieldName[str_target[i]];
fieldName.value = str_datetime;
fieldName.style.backgroundColor = '#FFB6C1';
// Set flag, etc.
window.close();
}
函数更新字段(str\u目标,str\u日期时间){
var fieldName=window.opener;
str_target=str_target.split('.');
对于(变量i=0;i
括号符号(
[]
)仅用于对象的属性,而不是对象本身。如果你觉得我的帖子有帮助,请投赞成票。你可以使用eval
函数构建一个字符串并将其作为代码进行计算,但我建议不要这样做
您的代码有几处错误:
window[“opener”]
,这将等同于window.opener
,但没有简单的[“window”]
window.opener.document
中,不能使用[]运算符导航多个级别。也就是说,不允许使用窗口[“开场白.文档”]
。您必须改用窗口[“打开器”][“文档”]
我更喜欢将dom路径跟踪从当前窗口隐藏回打开器。将其烘焙到函数中是合适的,因为函数将始终在子弹出窗口的上下文中使用。这样,您的函数调用更清晰、可读性更强。显然,将“myField”替换为要更新的字段的ID
<a href="javascript:window.opener.updateField( '03-10-2011', 'myField' );">3</a>
function updateField ( str_date, str_fieldname ) {
var fieldToUpdate = document.getElementById( str_fieldname );
fieldToUpdate.value = str_date;
fieldToUpdate.style.backgroundColor = '#FFB6C1';
// Set flag, etc.
window.close();
}
函数更新字段(str\u日期,str\u字段名){
var fieldToUpdate=document.getElementById(str_fieldname);
fieldToUpdate.value=str_日期;
fieldToUpdate.style.backgroundColor='#FFB6C1';
//设置标志等。
window.close();
}
我发现您的解决方案可读性强且优雅。唯一的问题是我不能让它工作。当我按下链接时,什么也没发生。我很确定函数没有被调用,因为我在那里放了一个警报@Kam:使用console.log而不是alert。它的用户友好得多。现在可以工作了,只是做了一些小改动。非常感谢。谢谢你的编辑!我必须承认没有测试代码,否则我会发现需要处理函数在哪个窗口上下文中运行。感谢使用[]的提示您是否看到Aadith和Paul建议的访问字段名的两种方法中的任何一种有任何偏好?Paul的方法更好。它更快更优雅。但是,我的方法是开箱即用的-除了updateField
函数之外,您不需要更改任何代码。它不会中断接口。=)我需要乔纳斯的回答来理解那个循环在做什么。这种方法看起来有点笨拙,不是吗?是的。我没有详细说明我的答案。乔纳斯提供了解释,我提供了代码。完全正确吗?哦,还有什么方法让你看起来很尴尬呢?我认为拆分字符串并遍历它很尴尬,效率很低。但是,是的,Paul的方法确实“破坏”了API。幸运的是这是一个很小的变化。我对结果很满意。
function updateField (str_target, str_datetime) {
var fieldName = window.opener;
str_target = str_target.split('.');
for (var i = 0; i < str_target.length; i++)
fieldName = fieldName[str_target[i]];
fieldName.value = str_datetime;
fieldName.style.backgroundColor = '#FFB6C1';
// Set flag, etc.
window.close();
}
<a href="javascript:window.opener.updateField( '03-10-2011', 'myField' );">3</a>
function updateField ( str_date, str_fieldname ) {
var fieldToUpdate = document.getElementById( str_fieldname );
fieldToUpdate.value = str_date;
fieldToUpdate.style.backgroundColor = '#FFB6C1';
// Set flag, etc.
window.close();
}