【问题标题】:Call Parent function from iframe then update iframe form value从 iframe 调用父函数,然后更新 iframe 表单值
【发布时间】:2012-07-18 15:57:12
【问题描述】:

我在父页面中有一个需要由 iframe 调用的函数,然后此函数会更新 iframe 中的表单值。我可以正常调用该函数,但表单值更新不起作用

我设置了一个警报来查看父函数是否可以看到输入值,但返回未定义,所以我假设我没有正确访问 ID

这是我的代码,试图在分成三个文本框的字段中自动初始化今天的日期

主要的js函数

 window.autoPartialDateBox = function(htmlID) {
if ( !jQuery('#'+htmlID+"_mm").val() && !jQuery('#'+htmlID+"_dd").val() && !jQuery('#'+htmlID+"_yy").val() ) {
            var myDate = new Date();    
            jQuery('#'+htmlID+"_mm").val(myDate.getMonth()+1 );                      
            jQuery('#'+htmlID+"_dd").val(myDate.getDate() ); 
            jQuery('#'+htmlID+"_yy").val(myDate.getFullYear() );               
} }

iframe

    <script type="text/javascript"> 
   $(function () {
        // this will populate the partial date box          
           $("#someElement").live("change", function() {
               if ($(this).val() == 'trigger') {
                window.top.autoPartialDateBox('partial_date_box');
               }

           });

        });
    </script>

Action <select name="someElement" id="someElement" class="valid">
    <option value="" selected="">Select an option</option> 
    <option value="trigger">Trigger</option>            
</select>

Day <input name="stop_dd_2747_mm" type="text" id="stop_dd_2747_mm">
Month <input name="stop_dd_2747_dd" type="text" id="stop_dd_2747_dd" >
Year <input name="stop_dd_2747_yy" type="text" id="stop_dd_2747_yy" >

【问题讨论】:

    标签: javascript jquery html iframe


    【解决方案1】:

    如果您认为问题在于访问 ID,可能是因为您试图在 jQuery 选择器中“构建”ID。我认为更好的解决方案是将函数传递给父元素,然后遍历节点树以找到您的输入字段。

    功能:

     window.autoPartialDateBox = function(parentElm) {  
    
         $nodes = jQuery(parentElm).children('input[type=text]');
    
         if (!$nodes[0].val() && !$nodes[1].val() && !$nodes[2].val()) {
    
    
            var myDate = new Date();    
            $nodes[0].val(myDate.getMonth()+1 );                      
            $nodes[1].val(myDate.getDate() ); 
            $nodes[2].val(myDate.getFullYear() );               
      } 
     }
    

    为您的输入字段添加一个容器:

    <div id="input_container">
       Day <input name="stop_dd_2747_mm" type="text" id="stop_dd_2747_mm">
       Month <input name="stop_dd_2747_dd" type="text" id="stop_dd_2747_dd" >
       Year <input name="stop_dd_2747_yy" type="text" id="stop_dd_2747_yy" >
    </div>
    

    我还没有测试过,但这是我会做的一般方法。如果您尝试在选择器中构建一个字符串,我不知道 jQuery 的行为如何。这似乎不是问题,但你永远不知道。

    编辑在 jQuery 命名空间中声明“节点”

    【讨论】:

    • 出现同样的错误,无法调用未定义的方法'val'。当函数包含在文档中时,在 jquery 选择器中构建字符串可以正常工作,当您将其包含在顶部/父级中然后尝试调用时它会失败
    • 如果错误发生在 If 那么你需要检查每个子节点的.val()!node[0].val() 等等。如果node[0].val() 发生错误,则需要在 jQuery 命名空间中使用$ 声明节点。
    • 是的,还是同样的错误,你认为它与元素上下文有关吗?像 jQuery('#'+htmlID+"_dd", window.frames[frameName].document).val() 不起作用,但父级中的选择器是否应该使用 iframe 上下文定义选择器?
    • 输入字段是在 iFrame 还是 Top Window 中?
    • 如果输入字段在 iFrame 中,那么这可能就是问题所在。因为从顶部窗口调用该方法,元素将存在于另一个窗口中。
    猜你喜欢
    • 1970-01-01
    • 2012-03-30
    • 2011-01-10
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多