javascript - 访问 iFrame 中的数据属性?

标签 javascript html forms iframe

我正在使用 123FormBuilder,它将 iFrame 添加到您的网站。我需要访问输入字段之一内的数据属性。

我如何在 iFrame 中访问它?我有以下代码,但我不确定它是否有效,因为 HTML 位于 iFrame 中。

document.querySelector([data-id=1203246]).value = clientId;

这是 iFrame 内 123FormBuilder 输入字段的代码:

<div data-role="container" data-type="virtual-form-table-row" data-hash="00000019" data-type-id="0" data-colspan="20" data-num-children="1">
  <div data-role="control" data-type="text" data-hash="0000001a" data-type-id="23" data-colspan="20" data-renderer-type="tln" data-id="1203246" data-is-active="1">
    <label data-role="label" id="text-0000001a-acc" data-i18n-text="control_label_1203246">GA Hidden Field</label>
    <dt data-role="instructions" id="text-0000001a-instr-acc" data-is-empty="1" data-i18n-text="control_instructions_1203246"></dt>
    <div data-role="input-row" data-is-first-row="1" data-is-last-row="1" data-fill-colspan="0">
       <div data-role="input-container" data-ui-role="ui-element" data-size="full">
         <span data-role="prefix-label" id="price-0000001a-prefix-acc" style="opacity: 0.5;"></span>
         <input type="text" data-role="i123-input" data-no-theme="" aria-labelledby="text-0000001a-acc text-0000001a-error-acc text-0000001a-instr-acc" placeholder="" style="padding-left: 8px;">
       </div>
     </div>
   <label data-role="error" id="text-0000001a-error-acc" data-is-empty="1"></label>
 </div>

最佳答案

我是 Alexandru Berce,123FormBuilder 的开发人员。 如果我的理解是正确的,您正在尝试动态设置表单字段的值。

document.querySelector([data-id=1203246]).value = clientId;

无法直接在 iframe 中执行代码,但可以通过发布消息来实现此目的。为此,您需要将 JS 脚本添加到 123FormBuilder 中的表单中。

转到设置 -> 高级 -> 表单并在其中添加脚本

这里是文档:https://www.123formbuilder.com/docs/can-i-add-a-custom-js-script-to-my-form/

此功能从白金计划开始可用。

我将在这里留下一个例子:

您的网站:

<html>
<body>

    <button onClick="setFieldValueInIframe(57728543, '123')">Set field value</button>

    <!-- www.123formbuilder.com script begins here -->
    <script
      type="text/javascript"
      defer
      src="https://www.123formbuilder.com/embed/5089685.js"
      data-role="form"
      data-default-width="936px"
    ></script>
    <!-- www.123formbuilder.com script ends here -->

</body>
<script>
    function setFieldValueInIframe(fieldId, fieldValue){
        const data = {
            action: 'setFieldValue',
            fieldId: fieldId,
            fieldValue: fieldValue
        };

        sendMessage(data, "*");
    }

    function sendMessage(messageData){
        const iframe = document.getElementsByTagName('iframe')[0];

        iframe.contentWindow.postMessage(messageData, "*");
    }

</script>

单击该按钮时,它会向 iframe 发送一条帖子消息,其中包含您尝试执行的操作。在 iframe 端,您有一个事件监听器,它将捕获所有消息,并且您可以对消息执行所需的任何操作(在本例中设置字段的值)。

我将脚本托管在 https://alexberce.github.io/client-scripts/set-field-value.js因此,如果您愿意,您可以尝试其他形式。

表单上的脚本:

if (window.addEventListener) {
      window.addEventListener("message", receiveMessage, false);
    } else if (window.attachEvent) {
      window.attachEvent("onmessage", receiveMessage);
    }

    function receiveMessage(event) {
      const { action } = event.data;
      const messageData = event.data;

      switch (action) {
        case "setFieldValue":
          const fieldId = String(messageData.fieldId),
            fieldValue = messageData.fieldValue;

          window.loader
            .getDOMAbstractionLayer()
            .setControlValueById(fieldId, fieldValue);
          break;

        default:
          console.warn("Action not implemented");
          break;
      }
    }

关于javascript - 访问 iFrame 中的数据属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58814529/

相关文章:

javascript - 内容安全策略 : Should a CSP contain hashes for external scripts?

javascript - 根据我在代码中输入的圆柱体高度和变量值上下动画 Canvas

javascript - 通过在 React 中使用 useRef 钩子(Hook)获取另一个组件的宽度来调整一个组件的大小

php - 交响乐 3 : Passing variables into forms

javascript - 提交表单后如何更改div?

javascript - 使用javascript动态编辑多个相同的HTML表单

javascript - 交换 img src 或显示/隐藏多个图像是否更快?

javascript - JQuery slideToggle超时

java - 无法使用 itext+flying saucer 呈现表单字段

javascript - 为什么过渡不适用于边界属性?