为什么Javascript完全内联运行,但如果外部引用则不行?

时间:2017-06-26 13:39:28

标签: javascript html forms

我正在尝试填充使用以下内容创建的下拉表单字段:

#include <stddef.h>
#include <stdlib.h>
#include <string.h>

typedef struct test_s {
  int id;
  char *p;
  struct test_s *next;
} test_t;

test_t** add(test_t **root, int id, char const *name){
  size_t len = strlen(name);
  test_t *newnode=(test_t*)malloc(sizeof(test_t)+len+1); // 1 goes for \0 terminator
  newnode->id=id;
  strcpy(newnode->p=(void*)(newnode+1), name);
  newnode->next=NULL;
  test_t **tail = root;
  while (*tail) {
    tail = &(*tail)->next;
  }
  *tail = newnode;
  return &(newnode->next);
}

使用以下JavaScript:

<div class="section">
    <label >Province</label><br>
    <select id="provinces"></select>
</div>

如果我将脚本放在HTML文档中,但如果我删除脚本标记并将其放在外部文件中,则没有任何反应。我已经使用

在HTML文件中引用了js文件
var provinces = ['Gauteng', 'Limpopo', 'Western Cape','Northern Cape','Mpumalanga','Kwazulu Natal','North West','Eastern Cape','Free State'],
select = document.getElementById( 'provinces' );
for( province in provinces ) {
    select.add( new Option( provinces[province] ) );
};

我确认我正在引用正确的字段。

我显然犯了一些其他愚蠢的错误。你们中的任何一位专家都会好心地告诉我哪里出错了吗?

3 个答案:

答案 0 :(得分:0)

检查是否 1)正确引用脚本文件(打开src位置)和 2)脚本标记位于正文中(理想情况下在section元素之后)。可能是javascript代码在呈现元素之前执行

答案 1 :(得分:0)

在DOM结构中创建元素之前,您正在调用脚本。

JavaScript代码:

<script type="text/javascript">    
    var provinces = ['Gauteng', 'Limpopo', 'Western Cape', 'Northern Cape', 'Mpumalanga', 'Kwazulu Natal', 'North West', 'Eastern Cape', 'Free State'],
        select = document.getElementById('provinces');
    for (province in provinces) {
        select.add(new Option(provinces[province]));
    };
</script>

如果我将脚本放在HTML文档中( 在选择元素创建之后放置脚本,这就是它工作的原因 ),这非常有效。

但如果我删除脚本标记并将其放在外部文件中没有任何反应( 您在html head section top中添加外部文件,脚本将执行即时头部分加载。它不会等待加载整个主体,因此您的脚本将无法获得选择元素&amp;您将在浏览器中收到JavaScript错误 "Uncaught TypeError: Cannot read property 'add' of null at ...")。我已经在HTML文件中引用了js文件 <script type="text/javascript" src="js/formcalculations.js"></script> 我已经确认我正在引用正确的字段。

我显然犯了一些其他愚蠢的错误( 你不是傻瓜,它发生在每个初学者身上,即使它发生了很多时间和我在一起......好吧,那个时候我还是个孩子:d )。你们中的任何一位专家都会好心地告诉我哪里出错了吗? ( 当然亲爱的,Stackers无处不在,愿意帮助每一个人:):)

  

正确的方法是在html正文的末尾添加脚本或外部javascript,那么你的脚本将获得所有必需的元素   从身体。

工作脚本:内联(无论是</head>之前还是</body>之前)

<script type="text/javascript">
    window.onload = function() {
        var provinces = ['Gauteng', 'Limpopo', 'Western Cape', 'Northern Cape', 'Mpumalanga', 'Kwazulu Natal', 'North West', 'Eastern Cape', 'Free State'],
        select = document.getElementById('provinces');
        for (province in provinces) {
            select.add(new Option(provinces[province]));
        };
    };
</script>

外部脚本代码:(无论是</head>之前还是</body>之前)

window.onload = function() {
    var provinces = ['Gauteng', 'Limpopo', 'Western Cape', 'Northern Cape', 'Mpumalanga', 'Kwazulu Natal', 'North West', 'Eastern Cape', 'Free State'],
        select = document.getElementById('provinces');
    for (province in provinces) {
        select.add(new Option(provinces[province]));
    };
};

答案 2 :(得分:-1)

你必须在加载dom后执行你的代码,你有一些选择如何做到这一点:

  1. 在页面末尾加载js;

  2. 在脚本代码上使用defer属性;

  3. pure JavaScript equivalent to jQuery's $.ready() how to call a function when the page/dom is ready for it