Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将内联代码移动到函数中,并生成对象名_Javascript - Fatal编程技术网

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();
    
    }