从弹出窗口赋值给父窗口。用于多个文件上传把文件路径传递过去。

JavaScript实现表单输入与窗口交互
1.htm
<form action="" method="post" name="form1">
<input type=text name=maintext>
<input type=button onclick="window.open('2.htm')" value="Open">
</form>

2.htm
<script language="javascript" >
window.opener.document.all.maintext.value="ddddd";
</script>

<think>我们正在使用FastAdmin框架,目标是在窗中选择数据后将数据传递父窗口的输入框。 根据引用[2],我们可以使用FastAdmin提供的Fast.api.layer.open方法打开一个窗(layer.open的封装)。 同时,我们需要在窗中选择数据后,将数据传递父窗口。这通常可以通过在窗页面中编写JavaScript,在确定选择时调用父窗口的方法来实现。 步骤: 1. 在父窗口(比如一个添加或编辑页面)中,有一个输入框(比如class为"item_no"),我们希望在点击这个输入框时弹出选择数据的窗口。 2. 使用Fast.api.layer.open打开一个窗,窗内容是一个独立的页面(比如/popup/purchase/itemno/index),这个页面通常是一个数据列表。 3. 在窗页面中,当用户选择某一行数据后,我们需要将选中的数据传递父窗口,并关闭窗。 关键点:如何将数据从子窗口窗)传递父窗口? 我们可以使用layer提供的回调函数,或者通过父窗口定义全局函数,子窗口调用父窗口的函数。 具体实现: 方法一(推荐):使用layer的end回调(在窗关闭时触发)或者使用子窗口调用父窗口函数。 在FastAdmin中,Fast.api.layer.open方法封装了layer.open,我们可以使用success回调来设置子窗口的函数到父窗口(这样在子窗口中就可以调用父窗口的函数),或者使用end回调在关闭时获取数据。 但是,根据引用[1]中的描述(虽然是Silverlight,但原理类似),我们可以通过以下方式: - 在父窗口中定义一个函数,用于接收数据并填充到输入框。 - 在窗页面中,选择数据后,调用父窗口的这个函数,然后关闭自身。 方法二:在窗页面中使用window.parent来访问父窗口的DOM和函数。 具体步骤: 第一步:在父窗口的JS代码中,定义接收数据的函数,并绑定输入框的点击事件来打开窗。 例如,在父窗口的JS文件(比如在对应的index.html或add.html的script部分)中: ```javascript $(function() { // 当点击某个输入框时,弹出选择窗口 $(document).on('click', '.item_no', function() { // 记录当前输入框,以便在回调中知道要填充到哪个输入框 var that = this; // 使用FastAdmin的窗方法 Fast.api.layer.open({ type: 2, // iframe层 title: '选择数据', area: ['80%', '90%'], content: 'http://你的域名/popup/purchase/itemno/index', // 窗内容URL end: function() { // 窗关闭后的回调,这里我们不需要,因为我们在选择时立即关闭并传递数据 }, success: function(layero, index) { // 这里可以将父窗口的函数挂载到窗页面的window对象上,以便窗页面调用 // 通过index找到窗的iframe的contentWindow var iframeWin = window[layero.find('iframe')[0]['name']]; // 在窗页面的window上挂载一个回调函数 iframeWin.selectCallback = function(data) { // 这里data是窗页面传递过来的数据 $(that).val(data.item_no); // 假设数据中有item_no字段 // 也可以填充其他字段,比如如果有多个字段,可以遍历赋值 // 关闭窗 layer.close(index); }; } }); }); }); ``` 第二步:在窗页面(/popup/purchase/itemno/index)中,当用户选择某一行后,调用父窗口传递过来的回调函数(selectCallback),并传递选择的数据。 在窗页面的JS中(比如在列表的行点击事件或者一个选择按钮的点击事件中): ```javascript // 假设我们点击表格行就选择 $('table tbody').on('click', 'tr', function() { // 获取该行的数据,这里假设已经将行数据绑定到了tr的data属性上,或者通过其他方式获取 var row = $(this).data('row'); // 假设在渲染时已经将行数据绑定到tr上 // 或者通过bootstrap table的方法获取行数据 // var row = $(this).bootstrapTable('getSelections')[0]; // 调用父窗口的回调函数 if (typeof parent.selectCallback === 'function') { parent.selectCallback(row); // 将行数据传递父窗口 } }); ``` 注意:如果窗页面是FastAdmin生成的表格页面,那么通常已经使用了bootstrap table,我们可以通过bootstrap table的方法获取选中的数据。 另一种更简单的方式(不通过success回调挂载函数): 在窗页面中直接使用parent对象调用父窗口的函数,前提是父窗口的函数是全局的。 在父窗口定义全局函数: ```javascript function selectItemCallback(data) { $('.item_no').val(data.item_no); } ``` 在窗页面中: ```javascript if (typeof parent.selectItemCallback === 'function') { parent.selectItemCallback(row); // 然后关闭窗 var index = parent.layer.getFrameIndex(window.name); // 先得到当前iframe层的索引 parent.layer.close(index); // 再执行关闭 } ``` 但是,由于我们可能在同一个页面有多个输入框需要弹出选择,所以我们需要知道当前是哪个输入框触发的窗。因此,我们可以在打开窗时,将当前输入框的jQuery对象或其他标识传递窗,或者使用闭包的方式(如第一种方法中,我们将当前输入框的DOM对象保存在闭包中,然后在回调中使用)。 考虑到通用性,我们采用第一种方法,在打开窗时,在success回调中给窗页面挂载回调函数,这样每个窗实例都有独立的回调。 另外,引用[3]中提到了自定义搜索及值,但我们的重点在值,所以这里不展开。 总结: 1. 在父窗口的输入框点击事件中,打开窗,并在success回调中给窗页面的window对象挂载一个回调函数(如selectCallback),这个回调函数会接收数据并填充到触发窗的输入框中,同时关闭窗。 2. 在窗页面中,选择数据后,调用这个回调函数,并传递数据。 注意:如果窗页面是FastAdmin生成的,通常已经包含了jQuery和bootstrap table等,可以直接使用。 示例代码: 父窗口(比如add.html对应的JS): ```javascript $(function() { // 绑定输入框的点击事件 $('.item_no').click(function() { var that = this; Fast.api.layer.open({ type: 2, title: '选择物品编号', area: ['800px', '600px'], content: '/popup/purchase/itemno/index', success: function(layero, index) { var iframeWin = window[layero.find('iframe')[0]['name']]; // 给窗页面挂载回调函数 iframeWin.selectCallback = function(data) { // 将数据填充到输入框 $(that).val(data.item_no); // 如果需要填充其他字段,比如: // $('.other-field').val(data.other_field); layer.close(index); // 关闭窗 }; } }); }); }); ``` 窗页面(/popup/purchase/itemno/index)的JS中: ```javascript // 假设我们有一个表格,点击行就选择 $(document).on('click', 'table tbody tr', function() { // 获取行数据,假设我们已经在行上绑定了data-row属性(在渲染时) var row = $(this).data('row'); // 或者如果是bootstrap table,可以使用: // var row = $(this).data('bootstrap.table').getSelections()[0]; 但这样写不准确 // 更准确的方式:使用bootstrap table的方法获取当前行的数据 // 但是注意,这里我们点击行,可能并没有选中,所以可以设置点击行选中,然后获取选中项 // 这里简化处理,假设我们点击行就是选中,并且只允许单选 // 调用父窗口的回调 if (typeof selectCallback === 'function') { selectCallback(row); } }); ``` 注意:在窗页面中,我们直接使用selectCallback,因为它是挂载在窗页面的window上的。 但是,如果窗页面是FastAdmin生成的,那么可能已经包含了列表和选择功能,我们可以添加一个“选择”按钮,然后在按钮事件中获取选中的数据并调用回调。 另外,如果窗页面是公共页面,我们可以在URL中传递一个回调函数名,但这样不太安全,所以推荐使用挂载函数的方式。 请根据实际项目调整代码,比如字段名、URL等。 相关问题: 1. 如何在FastAdmin中实现窗选择数据? 2. 如何将子窗口的数据传递父窗口? 3. 在FastAdmin中,如何自定义窗的样式和功能?</think>在 FastAdmin 中实现窗选择数据后传递父窗口输入框,可以通过以下步骤实现: ### 实现步骤 1. **父窗口打开窗** 在父窗口的 JS 文件中,使用 `Fast.api.layer.open()` 打开窗页面,并设置回调函数接收数据: ```javascript // 点击输入框时打开窗 $(document).on("focus", ".your-input-class", function () { var that = this; // 保存当前输入框对象 Fast.api.layer.open({ type: 2, title: "选择数据", area: ["80%", "90%"], content: "/your/popup/page/url", // 窗页面URL success: function (layero, index) { var iframeWin = window[layero.find('iframe')[0]['name']]; // 向子窗口注入回调函数 iframeWin.window.selectCallback = function (data) { $(that).val(data.selectedValue); // 将数据赋给输入框 layer.close(index); // 关闭窗 }; } }); }); ``` 2. **窗页面(子窗口)处理数据** 在窗页面的 JS 中,通过 `window.selectCallback` 回调函数传递数据: ```javascript // 窗页面中选择数据后的操作 function onSelect(data) { if (typeof window.selectCallback === "function") { // 向父窗口传递选中数据 window.selectCallback({ selectedValue: data.value, // 传递的数据字段 // 可添加其他字段... }); } else { Fast.api.error("回调函数未定义"); } } ``` 3. **绑定选择事件** 在窗页面中绑定选择按钮/行的点击事件: ```javascript // 示例:表格行点击事件 $(document).on('click', 'table tbody tr', function () { var rowData = $(this).data('row'); // 获取行数据 onSelect({ value: rowData.your_field // 需要传递的字段 }); }); ``` ### 关键说明 1. **数据传递机制**: - 父窗口通过 `success` 回调向子窗口注入 `selectCallback` 函数 - 子窗口通过 `window.selectCallback(data)` 回数据 - 父窗口在回调中处理数据并关闭窗 2. **参数说明**: - `type: 2`:表示 iframe 窗 - `area: ["80%", "90%"]`:窗尺寸 - `content`:窗页面 URL - `data.selectedValue`:自定义传递的数据字段 3. **多字段传递**: ```javascript // 子窗口传递多个字段 window.selectCallback({ field1: rowData.name, field2: rowData.id, field3: rowData.price }); // 父窗口接收 $(that).val(data.field1); $('#other-input').val(data.field2); ``` ### 完整示例 ```javascript // 父窗口代码 $(document).on("focus", ".product-select", function () { var targetInput = this; Fast.api.layer.open({ type: 2, title: "选择商品", content: "/admin/product/select", area: ["900px", "600px"], success: function (layero, index) { var iframe = layero.find('iframe')[0]; iframe.contentWindow.selectCallback = function (data) { $(targetInput).val(data.product_name); $('#product_id').val(data.product_id); // 填充隐藏域ID layer.close(index); }; } }); }); // 窗页面代码 function onProductSelect(row) { if (typeof window.selectCallback === "function") { window.selectCallback({ product_id: row.id, product_name: row.name, price: row.price }); } } ``` ### 注意事项 1. 确保窗页面 URL 路径正确 2. 父窗口和子窗口需在同一个域名下(避免跨域问题) 3. 使用 `layer.close(index)` 确保关闭当前窗实例 4. 复杂数据传递建议使用 JSON 格式 这种方法利用了 FastAdmin 内置的 `layer.open()` 扩展,通过函数注入实现双向通信,无需额外插件即可完成数据传递[^1][^2]。 --- ### 相关问题 1. 如何在 FastAdmin 窗中实现多选数据并批量传递父窗口? 2. 窗关闭后如何自动刷新父窗口的表格数据? 3. FastAdmin 中如何防止窗重复打开? 4. 如何给传递初始参数实现动态筛选? [^1]: 父窗口与子窗口间的数据传递机制 [^2]: FastAdmin 官方窗 API 文档 [^3]: 自定义搜索及值实现方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值