在运行时插入Javascript,无法访问变量

在运行时插入Javascript,无法访问变量,javascript,appendchild,Javascript,Appendchild,我使用javascript文件来存储图像和其他内容的列表。我想在运行时、页面加载期间和单击按钮后读取其中一个文件。我可以将javascript文件作为脚本加载,但无法立即访问其内容 这是我无法使用javascript加载本地文件的解决方案 <script> function Get_Slide_Show(Idx) { Raw_Album_Info = ''; alert('Before: ' + Raw_Album_Info); albumPath = 'photos/'

我使用javascript文件来存储图像和其他内容的列表。我想在运行时、页面加载期间和单击按钮后读取其中一个文件。我可以将javascript文件作为脚本加载,但无法立即访问其内容

这是我无法使用javascript加载本地文件的解决方案

<script>
function Get_Slide_Show(Idx) {
  Raw_Album_Info = '';
  alert('Before: ' + Raw_Album_Info);
  albumPath = 'photos/' + albumList[Idx];
  var script = document.createElement('script');
  script.src = albumPath + '/album_info.js';
  // document.head.appendChild(script);
  document.getElementsByTagName('head')[0].appendChild(script);
  alert('After: ' + Raw_Album_Info);
}

function Load_Slide_Show(Idx) {
  Get_Slide_Show(Idx);
  Load_Album_Info();
}

function Init_Slide_Show() {
  Load_Album_List("photos");
  Load_Slide_Show(0);
  showSlides();
}
</script>
我在开始时重置了原始相册信息,第一个警报确认了这一点。我希望第二个警报显示原始专辑信息的新值。没有

如果我拆下这条线

Album_Info = ''; 
然后,第二次运行Get_Slide_Show时,警报会显示上一次调用的值


所以我可以读取变量,但我不能立即访问它。我应该使用insertBefore,还是调用某种刷新?

加载脚本元素是异步的,在将其附加到文档之后的某个时间。发布的代码正在尝试访问
Raw\u Album\u Info
在加载脚本之前


尝试将加载事件处理程序添加到脚本元素以在加载后运行代码-可以首次访问处理程序中的
Raw\u Album\u Info
值。

加载脚本元素是在将其添加到文档后的某个时间异步进行的。发布的代码正在尝试访问
Raw\u Album\u Info
在加载脚本之前


尝试将加载事件处理程序添加到脚本元素以在加载后运行代码-可以首次访问处理程序中的
Raw\u Album\u Info
值。

在文档加载完成之前,Raw\u Album\u Info是未定义的。您可以执行document.readystate调用或其他操作,但下面我使用函数updatetest(),该函数使用setTimeout不断调用自己,直到定义了原始相册信息

在相册_info.js中,使用倾斜的勾号(在~键下方)会有所帮助。在var声明中,勾号位于所需文本的前后。如果您使用tick,那么编写一个简短的脚本就很容易了,它将自动从原始文本文件创建.js文件。例如,如果原始文本文件是album_info.txt,则bash脚本如下所示:

echo -n "var x=\`" > album_info.js
cat album_info.txt >> album_info.js
echo "\`" >> album_info.js

您在问题撰写中的原始专辑信息变量中的破折号错误。也许这只是一个写入错误,但如果该错误实际上存在于您的album_info.js代码中,则会阻止realRaw_album_info变量获得结果。 用于测试的my album_info.js的内容(注意,使用勾号创建.js文件也会保留文本文件中的换行符,因此如果要使用数组,可以在代码中使用var.split('\n'):

出于演示目的,我在顶部创建了一个albumList数组,在底部创建了一个脚本,以便显示一个包含可变内容的弹出窗口。我注释掉了这些警报,因为这个演示不需要它们。我注释掉了Raw\u Album\u Info=',因为它最初需要未定义,以便updatetest()正常工作

test.htm的内容,Firefox中的测试正常:

<script>
var albumList=["ipplr/","ipplr2/"] //my test paths

function Get_Slide_Show(Idx) {
  //Raw_Album_Info = '';          //do not set, leave as undefined
  //alert('Before: ' + Raw_Album_Info);
  albumPath = '/home/ken/temp/' + albumList[Idx];
  var script = document.createElement('script');
  script.src = albumPath + '/album_info.js';
  document.head.appendChild(script);
  //document.getElementsByTagName('head')[0].appendChild(script);
  //alert('After: ' + Raw_Album_Info);
}

function Load_Slide_Show(Idx) {
  Get_Slide_Show(Idx);
  Load_Album_Info();
}

function Init_Slide_Show() {
  Load_Album_List("photos");
  Load_Slide_Show(0);
  showSlides();
}
</script>

<script>
Get_Slide_Show(0)
updatetest()

function updatetest()
{
  if (typeof(Raw_Album_Info)=='undefined'){
    setTimeout('updatetest()',500)  //call back until defined
  }else{
    //you can alert, or just write to console to verify
    alert(Raw_Album_Info)
    console.log(Raw_Album_Info)
  }
}
</script>

var albumList=[“ipplr/”,“ipplr2/”]//我的测试路径
功能获取幻灯片放映(Idx){
//原始相册信息=“”;//不设置,保留为未定义
//警报(“之前:”+原始相册信息);
albumPath='/home/ken/temp/'+albumList[Idx];
var script=document.createElement('script');
script.src=albumPath+'/album_info.js';
document.head.appendChild(脚本);
//document.getElementsByTagName('head')[0].appendChild(脚本);
//警报('After:'+原始相册信息);
}
功能加载幻灯片放映(Idx){
获取幻灯片放映(Idx);
加载相册信息();
}
函数初始化幻灯片放映(){
加载相册列表(“照片”);
加载幻灯片放映(0);
放映幻灯片();
}
获取幻灯片放映(0)
updatetest()
函数updatetest()
{
if(typeof(原始相册信息)=“未定义”){
setTimeout('updatetest()',500)//在定义之前回调
}否则{
//您可以发出警报,也可以直接写入控制台进行验证
警报(原始相册信息)
console.log(原始相册信息)
}
}

原始相册信息在文档加载完成之前是未定义的。您可以执行document.readystate调用或其他操作,但下面我使用函数updatetest(),该函数使用setTimeout不断调用自己,直到定义了原始相册信息

在相册_info.js中,使用倾斜的勾号(在~键下方)会有所帮助。在var声明中,勾号位于所需文本的前后。如果您使用tick,那么编写一个简短的脚本就很容易了,它将自动从原始文本文件创建.js文件。例如,如果原始文本文件是album_info.txt,则bash脚本如下所示:

echo -n "var x=\`" > album_info.js
cat album_info.txt >> album_info.js
echo "\`" >> album_info.js

您在问题撰写中的原始专辑信息变量中的破折号错误。也许这只是一个写入错误,但如果该错误实际上存在于您的album_info.js代码中,则会阻止realRaw_album_info变量获得结果。 用于测试的my album_info.js的内容(注意,使用勾号创建.js文件也会保留文本文件中的换行符,因此如果要使用数组,可以在代码中使用var.split('\n'):

出于演示目的,我在顶部创建了一个albumList数组,在底部创建了一个脚本,以便显示一个包含可变内容的弹出窗口。我注释掉了这些警报,因为这个演示不需要它们。我注释掉了Raw\u Album\u Info=',因为它最初需要未定义,以便updatetest()正常工作

test.htm的内容,Firefox中的测试正常:

<script>
var albumList=["ipplr/","ipplr2/"] //my test paths

function Get_Slide_Show(Idx) {
  //Raw_Album_Info = '';          //do not set, leave as undefined
  //alert('Before: ' + Raw_Album_Info);
  albumPath = '/home/ken/temp/' + albumList[Idx];
  var script = document.createElement('script');
  script.src = albumPath + '/album_info.js';
  document.head.appendChild(script);
  //document.getElementsByTagName('head')[0].appendChild(script);
  //alert('After: ' + Raw_Album_Info);
}

function Load_Slide_Show(Idx) {
  Get_Slide_Show(Idx);
  Load_Album_Info();
}

function Init_Slide_Show() {
  Load_Album_List("photos");
  Load_Slide_Show(0);
  showSlides();
}
</script>

<script>
Get_Slide_Show(0)
updatetest()

function updatetest()
{
  if (typeof(Raw_Album_Info)=='undefined'){
    setTimeout('updatetest()',500)  //call back until defined
  }else{
    //you can alert, or just write to console to verify
    alert(Raw_Album_Info)
    console.log(Raw_Album_Info)
  }
}
</script>

var albumList=[“ipplr/”,“ipplr2/”]//我的测试路径
功能获取幻灯片放映(Idx){
//原始相册信息=“”;