2014-12-08 5 views
0
<html> 
<body> 
      var el = document.getElementById("tab"); 
      var tab = Table(el, data); 
      tab.showData(); 
      tab.takeData(); 
      var PieChart=drawPieChart(canvas); 
</body> 
</html> 

<script> 
function Table(el, data) { 
... 
... 
return{ 
showData: function(){ 
... 
... 
} 
takeData: function(){ 
var myData=new Array(); 
for (var i = 0; i < val2; i++) { 
      myData[i] = document.getElementById('polja' + i).value; 
} 
} 
... 
... 
}; 
} 


function drawPieChart(canvas){ 
... 
... 
return{ 
getmyData(

); 
... 
... 
    }; 
    } 
    </script> 

Как я могу получить myData в функции «drawPieChart», кроме создания глобальной переменной myData? thx Я думал в html сделать что-то вроде этого PieChart.getMyData (Table.takeData); или что-то подобноеjavascript получить массив от другой функции

+2

Это только меня или 'не myData' нигде в коде? – TheDude

+1

Кроме того, неправильный код. Вы не включаете JS-код внутри тега 'script', и у вас тоже нет правильного синтаксиса JS. Это работает для вас? – TheDude

+0

Работает jep.it. У меня около 200 строк кода, поэтому я просто ставил вещи, которые, как я думал, важны. , но, возможно, я просто усложняю – sritno

ответ

0

На основе вашего редактирования, вы можете сделать это:

function Table(el, data) { 
    var myData = new Array(); // Not global but accessible to every function that gets returned here 
    return{ 
    // removed unnecessary code 
    takeData: function(){ 
     for (var i = 0; i < val2; i++) { 
      myData[i] = document.getElementById('polja' + i).value; 
     } 
    }, 
    function drawPieChart(canvas){ 
     // Can access myData here 
    } 
    } 
} 
+0

Я не могу поставить его под функцию «Таблица». thx anyway – sritno

+0

Хорошо, способ форматирования кода заставляет его казаться, что вы можете. – TheDude

0

Во-первых, проблемы с вашим кодом:

  1. У вас есть блок JavaScript сидит внутри <body>. Это не стандартное, недопустимое и не будет выполнено. В частности, он будет отображаться как текст на странице, а не выполнен как JavaScript. Все JavaScript должны быть расположены в одном из следующих мест: тег inline <script>, внешний файл, который вы загружаете с тегом <script>, атрибут события, такой как onload="..." или атрибут, который может запускать JavaScript, например href="javascript:...", на <a> элементах.

  2. У вас есть синтаксическая ошибка в объекте, который вы возвращаете с Table(); нет разделителя запятой между парами хеш-ключей/значений (showData() и takeData()). Требуется запятая.

  3. У вас есть некоторые неинициализированные переменные, включая val2, data и canvas. Вероятно, вы просто выписали свой код, чтобы опустить соответствующую инициализацию, но вы должны попытаться представить полные самодостаточные образцы кода, задавая вопросы о переполнении стека.

Что касается вашего вопроса, то объект tab вы возвращаетесь из Table() выглядит очень много, как объект экземпляра класса на любом языке OO. JavaScript поддерживает парадигму OO через образец прототипа, поэтому разумным подходом было бы сделать Table полным классом, определив его прототип. Если вы сделаете это, вы можете сделать tab полным экземпляром Table, создав его с помощью оператора new, а затем вы можете сохранить массив myData в качестве атрибута на tab.Вот случайная демонстрация основана на примере кода:

http://jsfiddle.net/awytnngu/

HTML:

<div id="tab"> 
    <input id="polja0" value="def1"/> 
    <input id="polja1" value="def2"/> 
    <input id="polja2" value="def3"/> 
</div> 

JS:

function Table(el,data) { 
    this.el = el; 
    return this; 
} 
Table.prototype.showData = function() { 
    // ... 
}; 
Table.prototype.takeData = function() { 
    this.myData = new Array(); 
    var val2 = this.el.children.length; 
    for (var i = 0; i < val2; ++i) 
     this.myData[i] = document.getElementById('polja'+i).value; 
}; 
Table.prototype.drawPieChart = function(canvas) { 
    alert(this.myData); 
}; 

var el = document.getElementById('tab'); 
data = 'whatever'; 
var tab = new Table(el,data); 
tab.showData(); 
tab.takeData(); 
canvas = 'whatever'; 
var PieChart = tab.drawPieChart(canvas); 
0

Просто бросить в другой возможный подход, гораздо проще, чем прототип решение, вы можете взять параметр OUT на takeData(), а затем передать его в качестве аргумента в drawPieChart():

http://jsfiddle.net/uv8bh6nj/

HTML:

<div id="tab"> 
    <input id="polja0" value="def1"/> 
    <input id="polja1" value="def2"/> 
    <input id="polja2" value="def3"/> 
</div> 

JS:

function Table(el,data) { 

    return { 
     showData:function() { 
      // ... 
     }, 
     takeData:function(OUT) { 
      OUT.myData = new Array(); 
      var val2 = el.children.length; // closure 
      for (var i = 0; i < val2; ++i) 
       OUT.myData[i] = document.getElementById('polja'+i).value; 
     } 
    }; 

} 

function drawPieChart(canvas,myData) { 
    alert(myData); 
} 

var el = document.getElementById('tab'); 
data = 'whatever'; 
var tab = new Table(el,data); 
tab.showData(); 
var takeDataOUT = {}; 
tab.takeData(takeDataOUT); 
canvas = 'whatever'; 
var PieChart = drawPieChart(canvas,takeDataOUT.myData); 
Смежные вопросы