2015-06-15 6 views
-3

Я кодирую чат-программу, но я застрял в этой части.вызов функции javascript из другой функции

var Controller=function conversation() { 
this.createMessageNode=function(msg,sender,time,mid){ 
    var newMessage; 
    if(sender==sessionStorage.getItem('userid')){ 
     newMessage="<div class='message-sent' id='"+mid+"'>"+msg+"<span class='time'>"+time+"</span></div>"; 
    }else{ 
     newMessage="<div class='message-recv' id='"+mid+"'>"+msg+"<span class='time'>"+time+"</span></div>"; 
    } 
    sessionStorage.setItem('lastMessage',mid); 
    $('.chat-messages').append(newMessage); 
} 

this.getMessages=function(){ 
    if(sessionStorage.getItem('lastMessage')==null){ 
     sessionStorage.setItem('lastMessage',0); 
    } 
    $.ajax({url:"getmessages.php",type:"POST",data:{last:sessionStorage.getItem('lastMessage'),cid:sessionStorage.getItem('conversationid')},success:function(result) { 
     var messages=JSON.parse(result); 
     for (var i = 0; i < messages.length; i++) { 
      createMessageNode(messages[i].message,messages[i].sender,messages[i].time,messages[i].mid); 
      var cont=document.getElementById('chat-messages'); 
      cont.scrollTop=cont.scrollHeight; 
     }; 
    }}); 
} 

}

теперь, когда я сделать это он показывает сообщение об ошибке

Uncaught ReferenceError: createMessageNode is not defined 

В настоящее время в течение цикла «эта» переменная со ссылкой на объект Ajax. как я могу вызвать функцию createMessageNode?

+0

возможно дубликат (http://stackoverflow.com/questions/3809862/can-we-call-the-function -written-in-one-javascript-in-another-js-file) – abc123

+0

try 'this.createMessageNode (сообщения [i] .message, messages [i] .sender, сообщения [i] .time, messages [i]. mid); ' – stackoverfloweth

+0

, когда я использую this.create .... он показывает эту ошибку' Uncaught TypeError: this.createMessageNode не является функцией ' –

ответ

0

Этот вопрос createMessageNode() является метод объект Controller, поэтому вам нужно обратиться к экземпляру при его вызове. Не ссылаясь на экземпляр, движок JavaScript ищет функцию в текущей области, затем каждая более широкая область охвата вплоть до глобальной области.

Обычно вы будете использовать this ключевое слово, чтобы ссылаться на экземпляр, но в вашем случае, Ajax вызова JQuery изменил this контекст, так что вы не можете напрямую использовать this.

Возможное решение, перед вызовом АЯКС, хранить this контекст:

var that = this; 

Теперь в функции Ajax успеха:

that.createMessageNode(messages[i].message,messages[i].sender,messages[i].time,messages[i].mid); 
^^ refer to the instance 
+0

awesome. thanx @MrCode. –

1

Ваши функции связаны с объектом this. Если это глобальный объект (самый верхний родительский сфера), то вы можете ссылаться на функции в this по this.yourfunction

Вы должны изучить СФЕРА правильно понять

http://www.w3schools.com/js/js_scope.asp

+0

Посмотрите, что я получаю, когда я печатаю' for (var i = 0; i

0

Было бы, вероятно, лучше, чтобы написать свой код, следующий за лучшими прототипными типами наследования, например:

function Controller() { 
    this.chatMessages = $('.chat-messages'); 
} 

Controller.prototype.createMessageNode = function (msg, sender, time, mid) { 
    var newMessage; 
    if (sender == sessionStorage.getItem('userid')) { 
     newMessage = "<div class='message-sent' id='" + mid + "'>" + msg + "<span class='time'>" + time + "</span></div>"; 
    } else { 
     newMessage = "<div class='message-recv' id='" + mid + "'>" + msg + "<span class='time'>" + time + "</span></div>"; 
    } 
    sessionStorage.setItem('lastMessage', mid); 
    this.chatMessages.append(newMessage); 
}; 

Controller.prototype.getMessages = function() { 
    var _this = this; 

    if (sessionStorage.getItem('lastMessage') === null) { 
     sessionStorage.setItem('lastMessage', 0); 
    } 

    $.ajax({ 
     url: "getmessages.php", 
     type: "POST", 
     data: { 
      last: sessionStorage.getItem('lastMessage'), 
      cid: sessionStorage.getItem('conversationid') 
     }, 
     success: function (result) { 
      var messages = JSON.parse(result); 
      for (var i = 0; i < messages.length; i++) { 
       _this.createMessageNode(messages[i].message, messages[i].sender, messages[i].time, messages[i].mid); 
      } 
      var cont = $('#chat-messages'); 
      cont.scrollTop(cont.scrollHeight); 
     } 
    }); 
}; 

Это решает вопрос о контексте, создав истинный класс, например:

var conversation = new Controller(); 
conversation.getMessages(); 
conversation.createMessageNode('Hello, World!', 'JimmyBoh', new Date(), 8268124); 

Кроме того, всякий раз, когда у вас есть вложенные функции, он может помочь сохранить нужный контекст в локальной переменной, например _this или that, и т.д. . Вот более простой пример:

function outer() { 
    // Temporarily store your desired context. 
    var _this = this; 

    // Make any call that executes with a different context. 
    $.ajax({ 
     url: "getmessages.php", 
     type: "GET", 
     success: function inner(result) { 
      _this.doSomething(result); 
     } 
    }); 
}; 

Наконец, может быть время, когда вы хотите выполнить метод в другом контексте, чем ток. .call() и .apply() могут использоваться для запуска метода с указанным контекстом и аргументами. Например: [? Можно ли назвать функцию написанную в одном JavaScript в другом файле JS]

function printThis() { 
    console.log(this.toString()); 
    console.dir(arguments); 
} 

printThis.call('Hello, World!'); 
printThis.call('Call array:', [2, 4, 6, 8], 10); // Keeps arguments as-is. 
printThis.apply('Apply array:', [2, 4, 6, 8], 10); // Accepts an array of the arguments. 


function Sum(startingValue) { 
    this.value = startingValue || 0; 
} 

Sum.prototype.add = function (number) { 
    this.value += number; 
} 

var realSum = new Sum(2); 
var fakeSum = { 
    value: 3 
}; 

realSum.add(1); 
Sum.prototype.add.call(fakeSum, 2); 

console.log(fakeSum.value); // Prints '5' 
console.log(realSum.value); // Prints '3' 
+0

thanx. ya мне нужно немного реорганизовать мой код –

Смежные вопросы