2012-12-09 184 views
10

我试图创建一个Javascript聊天,并在后端使用Python。这是我使用的代码...ReferenceError:函数未定义 - JavaScript

<html> 
<head> 
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 
    <title>UDP Chat</title> 
    <!-- including JQuery just to simplify things --> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
    <script type="javascript/text"> 
    var chat_room_id = undefined; 
    var last_received = 0; 

    /** 
    * Initialize chat: 
    * - Set the room id 
    * - Generate the html elements (chat box, forms & inputs, etc) 
    * - Sync with server 
    * @param chat_room_id the id of the chatroom 
    * @param html_el_id the id of the html element where the chat html should be placed 
    * @return 
    */ 
    function init_chat(chat_id, html_el_id) { 
     chat_room_id = chat_id; 
     layout_and_bind(html_el_id); 
     sync_messages(); 
    } 

    /** 
    * Asks the server which was the last message sent to the room, and stores it's id. 
    * This is used so that when joining the user does not request the full list of 
    * messages, just the ones sent after he logged in. 
    * @return 
    */ 
    function sync_messages() { 
     $.ajax({ 
      type: 'POST', 
      data: {id:window.chat_room_id}, 
      url:'/chat/sync/', 
      dataType: 'json', 
      success: function (json) { 
       last_received = json.last_message_id; 
      } 
     }); 

     setTimeout("get_messages()", 2000); 
    } 

    /** 
    * Generate the Chat box's HTML and bind the ajax events 
    * @param target_div_id the id of the html element where the chat will be placed 
    */ 
    function layout_and_bind(html_el_id) { 
      // layout stuff 
      var html = '<div id="chat-messages-container">'+ 
      '<div id="chat-messages"> </div>'+ 
      '<div id="chat-last"> </div>'+ 
      '</div>'+ 
      '<form id="chat-form">'+ 
      '<input name="message" type="text" class="message" />'+ 
      '<input type="submit" value="Say"/>'+ 
      '</form>'; 

      $("#"+html_el_id).append(html); 

      // event stuff 
      $("#chat-form").submit(function() { 
       var $inputs = $(this).children('input'); 
       var values = {}; 

       $inputs.each(function(i,el) { 
        values[el.name] = $(el).val(); 
       }); 
       values['chat_room_id'] = window.chat_room_id; 

       $.ajax({ 
        data: values, 
        dataType: 'json', 
        type: 'post', 
        url: '/chat/send/' 
       }); 
       $('#chat-form .message').val(''); 
       return false; 
     }); 
    }; 

    /** 
    * Gets the list of messages from the server and appends the messages to the chatbox 
    */ 
    function get_messages() { 
     $.ajax({ 
      type: 'POST', 
      data: {id:window.chat_room_id, offset: window.last_received}, 
      url:'/chat/receive/', 
      dataType: 'json', 
      success: function (json) { 
       var scroll = false; 

       // first check if we are at the bottom of the div, if we are, we shall scroll once the content is added 
       var $containter = $("#chat-messages-container"); 
       if ($containter.scrollTop() == $containter.attr("scrollHeight") - $containter.height()) 
        scroll = true; 

       // add messages 
       $.each(json, function(i,m){ 
        if (m.type == 's') 
         $('#chat-messages').append('<div class="system">' + replace_emoticons(m.message) + '</div>'); 
        else if (m.type == 'm') 
         $('#chat-messages').append('<div class="message"><div class="author">'+m.author+'</div>'+replace_emoticons(m.message) + '</div>'); 
        else if (m.type == 'j') 
         $('#chat-messages').append('<div class="join">'+m.author+' has joined</div>'); 
        else if (m.type == 'l') 
         $('#chat-messages').append('<div class="leave">'+m.author+' has left</div>'); 

        last_received = m.id; 
       }) 

       // scroll to bottom 
       if (scroll) 
        $("#chat-messages-container").animate({ scrollTop: $("#chat-messages-container").attr("scrollHeight") }, 500); 
      } 
     }); 

     // wait for next 
     setTimeout("get_messages()", 2000); 
    } 

    /** 
    * Tells the chat app that we are joining 
    */ 
    function chat_join() { 
     $.ajax({ 
      async: false, 
      type: 'POST', 
      data: {chat_room_id:window.chat_room_id}, 
      url:'/chat/join/', 
     }); 
    } 

    /** 
    * Tells the chat app that we are leaving 
    */ 
    function chat_leave() { 
     $.ajax({ 
      async: false, 
      type: 'POST', 
      data: {chat_room_id:window.chat_room_id}, 
      url:'/chat/leave/', 
     }); 
    } 

    // attach join and leave events 
    $(window).load(function(){chat_join()}); 
    $(window).unload(function(){chat_leave()}); 

    // emoticons 
    var emoticons = { 
     '>:D' : 'emoticon_evilgrin.png', 
     ':D' : 'emoticon_grin.png', 
     '=D' : 'emoticon_happy.png', 
     ':\\)' : 'emoticon_smile.png', 
     ':O' : 'emoticon_surprised.png', 
     ':P' : 'emoticon_tongue.png', 
     ':\\(' : 'emoticon_unhappy.png', 
     ':3' : 'emoticon_waii.png', 
     ';\\)' : 'emoticon_wink.png', 
     '\\(ball\\)' : 'sport_soccer.png' 
    } 

    /** 
    * Regular expression maddness!!! 
    * Replace the above strings for their img counterpart 
    */ 
    function replace_emoticons(text) { 
     $.each(emoticons, function(char, img) { 
      re = new RegExp(char,'g'); 
      // replace the following at will 
      text = text.replace(re, '<img src="/media/img/silk/'+img+'" />'); 
     }); 
     return text; 
    } 
    </script> 
</head> 
<body> 
    <div id="chat"> 
    </div> 

    <script type="text/javascript"> 
    $(window).ready(function(){ 
     var chat_id = 1; 
     init_chat({{ chat_id }}, "chat"); 
    }) 
    </script> 
</body> 
</html> 

当我加载页面在Firefox,我得到:

ReferenceError: init_chat is not defined  
init_chat({{ chat_id }}, "chat"); 

但是,函数init_chat明确定义。我究竟做错了什么? 我为页面创建了一个jsFiddle

+0

关于jsFiddle,你必须选择jQuery,并使用“no wrap(head)”。那对我来说没有错误。由于这两件事情是与jsFiddle相关的,所以你的页面上一定有其他事情发生。 – pimvdb

+0

@pimvdb你能看到正在创建的聊天框吗? – cybertextron

+0

你也可以将MIME类型修改为'type =“application/javascript”'或'“text/javascript”' – rjz

回答

13

当您在head部分中定义函数并在尚未初始化document时调用它们时会发生这种情况。移动script部分,在那里进行初始化并试用。

由于您使用jQuery的,这也将是更好,如果你可以初始化的变量和函数下包围整个脚本,并调用内部document的准备状态的功能,它可能会工作。

$(document).ready(function(){ 
    var chat_id = 1; 
    init_chat({{ chat_id }}, "chat"); 
    // Something wrong here. Is it really chat_id inside {{ }}? 
}); 
+0

@Asad在答案中添加了问题。 :) –

+1

哎呦,猜我错过了。我怀疑这个调​​用只是为了'chat_id'。 –

2

在你的小提琴中,你定义了所有加载函数并在加载完成之前调用它们。以相反的方式做。这里是一个固定的fiddle

您的对象文字语法也是重击。 {{chat_id}}将导致语法错误。

0

只是改变type="javascript/text"type="text/javascript",你会发现它的工作。

+0

'

  • 11. 未捕获ReferenceError:未定义test(函数)
  • 12. 未捕获ReferenceError:函数未定义
  • 13. JavaScript未捕获ReferenceError:未定义jQuery; Uncaught ReferenceError:$未定义
  • 14. ReactJS - 未捕获ReferenceError:函数未定义
  • 15. ReactJS未捕获ReferenceError函数未定义
  • 16. Uncaught ReferenceError:$未在jquery函数中定义
  • 17. ReferenceError:$未定义函数错误
  • 18. ReferenceError:使用onclick时未定义函数
  • 19. JavaScript - ReferenceError:未定义WebSocket
  • 20. ReferenceError:窗口未定义Javascript
  • 21. ReferenceError:____未定义
  • 22. JavaScript - 未捕获ReferenceError:我的函数未定义
  • 23. ReferenceError:$未定义
  • 24. Google Script ReferenceError函数未定义
  • 25. ReferenceError:$未定义或未捕获ReferenceError:$未定义
  • 26. Chrome:Uncaught ReferenceError:$未定义
  • 27. Javascript未捕获ReferenceError:增量未定义
  • 28. ReferenceError:$未定义yii2
  • 29. Uncaught ReferenceError:$未定义
  • 30. JavaScript中的ReferenceError。在追加函数中未定义的字符