Rails 6 次加载中需要自定义 JS,但随后 none 的函数可以正常工作
Custom JS required in Rails 6 loads, but then none of the functions work
快把我逼疯了,因为它应该如此简单!!!
// file: /app/javascript/packs/application.js
require("jquery")
require("custom/sites_manage")
// file: /app/javascript/custom/sites_manage.js
console.log(">>> this file is being loaded")
function testFunc() {
return "asdf"
}
当我启动本地服务器并转到主页时,我确实在控制台中看到 >>> this file is being loaded
太棒了!但是当我打电话给 testFunc()
时,我得到:Uncaught ReferenceError: testFunc is not defined
为什么???我不认为我在这个主题上所做的与众多 answers/tutorials 有什么不同(例如,, or this one)
这个问题可能有两个原因:
Firstone:js 文件正在加载到当前的 iframe 中,但在无法访问的上下文中。解决方法:在testFunc的定义下添加一行window.publicTestFunc = testFunc;像这样:
function testFunc() {
return "asdf";
}
window.publicTestFunc = testFunc;
如果问题是上下文引起的,现在您应该可以从上下文外部调用 publicTestFunc。
第二个原因:js文件正在iframe上加载。在这种情况下,解决问题有点复杂,iframe 与 ondata 事件之间的消息传递,或者使用 iframe url 哈希是唯一可用的通信机制......所以通常总是更好的主意来找出为什么会这样正在发生(如果是这种情况,我需要更多信息)。
编辑:可能还有第三个原因:js文件是作为网络工作者加载的……网络工作者也有独立的上下文。通信情况类似iframe场景
然而,可能是第一个原因,使用 window.publicfunction = privatefunction 你应该可以调用你的函数。
当您使用 webpack 时,您需要导出您的函数以允许其他文件访问它:
function testFunc() {
return "asdf"
}
export default testFunc;
并使用它:
import testFunc from '../path/to/custom/sites_manage.js'
testFunc()
快把我逼疯了,因为它应该如此简单!!!
// file: /app/javascript/packs/application.js
require("jquery")
require("custom/sites_manage")
// file: /app/javascript/custom/sites_manage.js
console.log(">>> this file is being loaded")
function testFunc() {
return "asdf"
}
当我启动本地服务器并转到主页时,我确实在控制台中看到 >>> this file is being loaded
太棒了!但是当我打电话给 testFunc()
时,我得到:Uncaught ReferenceError: testFunc is not defined
为什么???我不认为我在这个主题上所做的与众多 answers/tutorials 有什么不同(例如,
这个问题可能有两个原因:
Firstone:js 文件正在加载到当前的 iframe 中,但在无法访问的上下文中。解决方法:在testFunc的定义下添加一行window.publicTestFunc = testFunc;像这样:
function testFunc() {
return "asdf";
}
window.publicTestFunc = testFunc;
如果问题是上下文引起的,现在您应该可以从上下文外部调用 publicTestFunc。
第二个原因:js文件正在iframe上加载。在这种情况下,解决问题有点复杂,iframe 与 ondata 事件之间的消息传递,或者使用 iframe url 哈希是唯一可用的通信机制......所以通常总是更好的主意来找出为什么会这样正在发生(如果是这种情况,我需要更多信息)。
编辑:可能还有第三个原因:js文件是作为网络工作者加载的……网络工作者也有独立的上下文。通信情况类似iframe场景
然而,可能是第一个原因,使用 window.publicfunction = privatefunction 你应该可以调用你的函数。
当您使用 webpack 时,您需要导出您的函数以允许其他文件访问它:
function testFunc() {
return "asdf"
}
export default testFunc;
并使用它:
import testFunc from '../path/to/custom/sites_manage.js'
testFunc()