Как я могу передать параметр - PullRequest
0 голосов
/ 29 сентября 2011

Только для примеров

machineId = 150018;
paper = raphel('canvas_container', 15, 20);
rect = paper.rect().attr({.....});
rect.node.ondblclick = function() {
  window.open("graph.php?mach_id=" + id);     
}

Вопрос: Как передать значение machineId в id;

Мне нужен результат, чтобы открыть новое окно с URL http://localhost/graph.php?mach_id=150018;


код из дублирующего вопроса

function showUtilization(machineId, rectUtil, txtResult, txtMCName, rectCover) {
    for (i = 0; i < machineId.length; i++) {
        $.ajax({
            url: 'ajax/getonemachineinfo.php',
            data: { id: machineId[i] }, 
            dataType: 'text',
            async: false,
            success: function(data) {
                results = data.split(',');

                status = results[0];
                utilize = results[1];

                // Machine Name
                switch (status) {
                    case '0': var colorCode = "#FF0000"; break;
                    case '1': var colorCode = "#33CC33"; break;
                    case '2': var colorCode = "#808080"; break;
                }
                txtMCName[i].attr({ fill: colorCode });

                // utilization
                rectUtil[i].attr({ width: (utilize * conversionFactor())/100 });

                if (utilize <= 30) {
                    var colorAttr = [{ fill: "#FF0000" }];
                } else if ((utilize > 30) && (utilize <= 60)) {
                    var colorAttr = [{ fill: "#FFFF00" }];
                } else if (utilize > 60) {
                    var colorAttr = [{ fill: "#33CC33" }];
                }
                rectUtil[i].attr(colorAttr);

                txtResultAttr = [{ text: utilize + '%'}];
                txtResult[i].attr(txtResultAttr);
                txtResult[i].attr(colorAttr);
                rectCover[i].node.ondblclick = function() {
                    window.open("graph.php?mach_id=" + machineId[i]);               
                }
            }
        });
    }
} (2

Ответы [ 4 ]

0 голосов
/ 29 сентября 2011

Просто измените id на machineId, и ваш код будет работать как есть, так как вы создаете другую функцию, которая имеет доступ к переменным в области действия.

Дополнительные пояснения по крышкам и областям применения

0 голосов
/ 29 сентября 2011

machineId уже задана глобально, поэтому она будет доступна для использования непосредственно в действии ondblclick. Кроме того, вы должны добавить ключевое слово var перед объявлением machineId.

var machineId = 150018;
paper = raphel('canvas_container', 15, 20);
rect = paper.rect().attr({.....});
rect.node.ondblclick = function() {
  window.open("graph.php?mach_id=" + machineId);     
}
0 голосов
/ 29 сентября 2011

Что если вы измените код на

machineId = 150018;
paper = raphel('canvas_container', 15, 20);
rect = paper.rect().attr({.....});
rect.node.ondblclick = function() {
  window.open("graph.php?mach_id=" + machineId);     
}

То есть вместо id просто передайте machineId.

0 голосов
/ 29 сентября 2011

Что не так с этим:

window.open("graph.php?mach_id=" + machineId);

Если (необъяснимая) проблема заключается в том, что вам нужно сохранить значение machineId в то время, когда обработчик ondblclick равен , определен , а не использовать его значение в то время, когда обработчик выполнено , вам нужно закрытие:

(function (id) {
   rect.node.ondblclick = function() {
     window.open("graph.php?mach_id=" + id);     
   }
})(machineId);

ОБНОВЛЕНИЕ: ОК, основываясь на новом коде, который вы разместили, я вижу, что я был на правильном пути с идеей закрытия выше. Проблема в том, что ваши обработчики событий пытаются использовать индекс i в какой-то момент в будущем, когда i будет равно любому значению, которое было у него, когда цикл закончился. Вам нужно что-то вроде этого:

function showUtilization(machineId, rectUtil, txtResult, txtMCName, rectCover) {
    for (var index = 0; index < machineId.length; index++) {
        (function(i){
           $.ajax({
               // all of your other code here, where anytime it
               // uses i it will be using the parameter of the
               // anonymous function rather than the loop counter
               // (which I've renamed to "index" to avoid confusion
               // with "i")
           });
        })(index);
    }
}

Я изменил цикл для использования счетчика с именем index, который передается анонимной функции, которая немедленно выполняется. Ваш существующий код, т. Е. Все, что у вас есть внутри вызова $.ajax({ });, идет внутри этой анонимной функции. Когда ваш успех и обработчики ondblclick будут выполнены в какой-то момент в будущем, они будут использовать i из своего собственного замыкания, а не индекс цикла.

...