Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: как сравнить два объекта?

как сравнить два объекта?

var a = {
1 : 3
};

var b = {
1 : 3
};


alert(a == b);


Ответ:
Сделать функцию, которая (1) получит список свойств и (2) сравнит их величины. Если свойство является объектом, то потребуется рекурсивный вызов. Можно сначала сравнить сам список свойств, не залезая в величины. Также можно наложить дополнительные условия; например, если свойство является функцией, то исключить из сравнения.

"На коленке" где-то так. Добавь еще внутри цикла анализ, является ли свойство объектом и если да, то тогда вызывай рекурсивно эту же функцию. Это в качестве "домашнего задания" :) Чтобы сам поработал с кодом немного.
Код. Кликнуть для просмотра.
<!DOCTYPE html>
<html>

<head>
<meta
charset="utf-8">
<script>

var
obj1 = {
1: 3
}

var obj2 = {
2: 4
}

function comp( o1, o2) {
if( typeof(o1) != 'object' || typeof(o2) != 'object' ) {
if( o1 == o2 ) {
return true;
}
return false;
}
var keys1 = Object.keys(o1);
var keys2 = Object.keys(o2);
if( keys1.length != keys2.length ) {
return false;
}
for( var i=0; i<keys1.length; i++) {
if( keys1[i] != keys2[i] ) {
return false;
}
if( o1[ keys1[i] ] != o2[ keys2[i] ] ) {
return false;
}
}

return true;
}


</script>
</head>
<body
onload="comp( obj1, obj2 ) ? alert( 'equal' ) : alert('not equal') ">

</body>
</html>
Вопрос: откуда берется в скобках метода записи - значение (newvalue)?

откуда берется в скобках метода записи - значение (newvalue)?
так как внутри метода следует var ratio = newvalue/oldvalue;


Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var p = {
    // x и y обычные свойства с данными, доступные для чтения/записи
    x: 1.0, y: 1.0,
    
    // r - доступное для чтения/записи свойство с двумя методами доступа. 
    // Не забывайте добавлять запятые после методов доступа
    get r() { 
        return Math.sqrt(this.x*this.x + this.y*this.y);
    },
    set r(newvalue) {
        var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y);
        var ratio = newvalue/oldvalue; 
        this.x *= ratio; 
        this.y *= ratio;
    },
    
    // theta - доступное только для чтения свойство с единственным методом чтения
    get theta() { return Math.atan2(this.y, this.x); }
};
Ответ: Undefined, к нему ведь ничего не обращается.
Вы пробовали запускать скрипт?
Ладно, напишу комменты
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var p = {
    // x и y обычные свойства с данными, доступные для чтения/записи
    x: 2.0, y: 0.0, // хороший пример для извлечения не иррационального корня
    
    // r - доступное для чтения/записи свойство с двумя методами доступа. 
    // Не забывайте добавлять запятые после методов доступа
    get r() { 
        return Math.sqrt(this.x*this.x + this.y*this.y); // извлекаем корень из x^2 + y^2. Корень из (4 + 0) = 2
    },
    set r(newvalue) { 
        var oldvalue = Math.sqrt(this.x*this.x + this.y*this.y); //  аналогично восьмой строке
        var ratio = newvalue/oldvalue;  // делит наш аргумент на oldvalue
        this.x *= ratio; // умножает x на radio
        this.y *= ratio; // умножает y на radio
    },
    
    // theta - доступное только для чтения свойство с единственным методом чтения
    get theta() { 
      return Math.atan2(this.y, this.x); // арктангенс
    }
};
console.log(p.r) // 2
p.r = 4
console.log(p.r) // 4
p.r = 'cfbgdf'
console.log(p.r) // NaN
Вопрос: Описание интерфейса метода с использованием тест-файла Mocha

К сожалению я недостаточно хорошо понимаю ООП в JS и как следствие я застрял на написании очередного метода. Речь идет об алгоритме Max Heap. Ниже приведена лишь часть, которой достаточно для реализации метода. Суть задания: Дан набор методов. Необходимо реализовать их интерфейс используя код теста Mocha. В данный момент я застрял на методе swapWithParent(). Подскажите пожалуйста как его реализовать.
Заранее благодарю всех, кто примет участие!

Основной файл:

"use strict";

class Node {
constructor(data, priority) {
this.data = data;
this.priority = priority;
this.parent = null;
this.left = null;
this.right = null;
}

appendChild(node) {
node.parent = this;

if (this.left && this.right) {
return;
}

if (this.left) {
this.right = node;
return;
}

this.left = node;
}

removeChild(node) {
if (node == this.left) {
this.left = null;
} else if(node == this.right) {
this.right = null;
} else return error;

node.parent = null;
}

remove() {
if (!this.parent) {
return;
} else {
this.parent.removeChild(this);
}
}

swapWithParent() {
if (!this.parent) {
return;
}

}
}

module.exports = Node;


Описание работы метода swapWithParent() в тест файле Mocha:

describe('#swapWithParent', () => {
it('does nothing if node does not have parent', () => {
const node = new Node(15, 42);

expect(() => {
node.swapWithParent();
}).not.to.throw();
});

it('updates parent.parent', () => {
const parent = new Node(15, 42);
const child = new Node(42, 15);

parent.appendChild(child);
child.swapWithParent();

expect(parent.parent).to.equal(child);
});

it('updates parent.parent.parent', () => {
const root = new Node(8, 8);
const child = new Node(4, 4);
const grandson = new Node(2, 2);

root.appendChild(child);
child.appendChild(grandson);

grandson.swapWithParent();

expect(child.parent).to.equal(grandson);
expect(grandson.parent).to.equal(root);
});

it('updates child.parent', () => {
const parentOfParent = new Node(100, 500);
const parent = new Node(15, 42);
const child = new Node(42, 15);

parentOfParent.appendChild(parent);
parent.appendChild(child);
child.swapWithParent();

expect(child.parent).to.equal(parentOfParent);
});

it('updates parent.child.parent', () => {
const root = new Node(1, 2);
const left = new Node(3, 4);
const right = new Node(5, 6);

root.appendChild(left);
root.appendChild(right);

right.swapWithParent();

expect(left.parent).to.equal(right);
})

it('updates children of node and parent node', () => {
const root = new Node(42, 15);
const left = new Node(13, 42);
const right = new Node(0, 1);
const childOfLeft = new Node(0, 15);

root.appendChild(left);
root.appendChild(right);
left.appendChild(childOfLeft);

left.swapWithParent();

expect(left.right).to.equal(right);
expect(left.left).to.equal(root);
expect(root.left).to.equal(childOfLeft);
});

it('maintains correct state of parent.parent.left and parent.parent.right', () => {
const root = new Node(15, 42);
const left = new Node(42, 15);
const right = new Node(13, 42);
const childOfLeft = new Node(13, 34);
const childOfRight = new Node(0, 1);

root.appendChild(left);
root.appendChild(right);
left.appendChild(childOfLeft);
right.appendChild(childOfRight);

childOfLeft.swapWithParent();
childOfRight.swapWithParent();

expect(root.left).to.equal(childOfLeft);
expect(root.right).to.equal(childOfRight);
});
});
Ответ: Привет! я новичек и решаю тоже это задание вот моя реализация этого метода все тесты проходят возможно реализация далека от идеала но зато есть почва для размышлений

swapWithParent() {
		if (!this.parent) return

		var thisChildLeft = this.left;
		var thisChildRight = this.right;
		var thisParent = this.parent;

		var parentChildRight = this.parent.right;
		var parentChildLeft = this.parent.left;
		var parentParent = this.parent.parent;

		if(parentParent){
			var parentParentLeft = this.parent.parent.left;
			var parentParentRight = this.parent.parent.right;
		}

		this.parent.parent = this;
		this.parent = parentParent;

		if (this === parentChildRight){
			if (parentChildLeft){
				this.left = parentChildLeft;
				parentChildLeft.parent = this;
			}

			this.right = thisParent;
			thisParent.rigth = thisChildRight;
			thisParent.left = thisChildLeft;
		}

		if (this === parentChildLeft){
			if (parentChildRight){
				this.right = parentChildRight;
				parentChildRight.parent = this;
			}

			this.left = thisParent;
			thisParent.rigth = thisChildRight;
			thisParent.left = thisChildLeft;
		}


		if (thisParent === parentParentLeft){
			this.parent.left = this;
		}

		if (thisParent === parentParentRight){
			this.parent.right = this;
		}
	}
Вопрос: Контекст объекта внутри метода с параметром event

Подскажите в такой ситуации.
Есть объект:
const testApp = {
    
    typesAll: document.querySelectorAll('.type'),
    type: '',
    

    event: function() {
        this.typesAll.forEach( item => item.addEventListener('click', this.selectType)); // Вызов метода
    },


    selectType: function (e) {
        
        if (e.type == 'click' || (e.type == 'keypress' && (e.which === 13 || e.keyCode === 13))) {
            
            testApp.type = this.getAttribute('name'); // тут testApp заменить контекстом объекта???

        }

    }

}

Метод selectType принимает параметр event.
Внутри метода я специально оставил кусок кода чтоб показать что методу нужны event и контекст элемента по которому произошел клик, чтоб получить значение из атрибута name.

Вопрос: могу ли я в 16 строке заменить testApp контекстом объекта, чтоб не писать имя объекта? При этом мне остаются нужны event и контекст элемента по которому произошёл клик.

Вроде как можно через передать, но я не знаю как тогда правильно передать event и контекст самого элемента по которому сделан клик.

***Ага, элемент можно передать как item, сам объект как this.

Если можно всунуть всё это при вызове метода, покажите пожалуйста как правильно это делается.

Или лучше в данном случае оставить так как есть?
Ответ: MC-XOBAHCK,

const testApp = {

    typesAll: document.querySelectorAll('.type'),
    type: '',
    event: function() {
        this.typesAll.forEach(item => item.addEventListener('click', this.selectType(this))); // Вызов метода
    },


    selectType: function(obj) {
        return function(e) {
            if (e.type == 'click' || (e.type == 'keypress' && (e.which === 13 || e.keyCode === 13))) {

                obj.type = this.getAttribute('name'); // тут testApp заменить контекстом объекта???

            }

        }
    }

}
Вопрос: Вывод графика пошагового решения нелинейного уравнения Методом Ньютона не работет

Здравствуйте. Помогите решить проблему нубу: не выводится график пошагового решения нелинейного уравнения методом Ньютона.
Скрипт:
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
<script type="text/javascript">
var ctx = can.getContext('2d');
                        function koord(mash)//оси координат
                        {
                            var tm1 = -10, tm2 = 4;
                            var i, numV, numG;
 
                            ctx.beginPath();
                            ctx.clearRect(0, 0, can.width, can.height);
                            ctx.strokeStyle = "blue";
 
                            ctx.moveTo(1, 250);//оси координат
                            ctx.lineTo(1000, 250);
                            ctx.moveTo(500, 250);
                            ctx.lineTo(500, 1);
                            ctx.lineTo(500, 500);
                            for (i = 0; i <= 1000 - mash; i += mash) { //насечки х
                                ctx.strokeText(tm1, i + 5, 265);//цифры на осях
                                tm1 += 1;
                                ctx.moveTo(i, 253);
                                ctx.lineTo(i, 247);
                            }
 
                            for (i = mash; i <= 500; i += mash) {  //насечки у
                                ctx.strokeText(tm2, 530, i);//цифры на осях
                                tm2 -= 1;
                                ctx.moveTo(497, i);
                                ctx.lineTo(503, i);
                            }
                            ctx.lineWidth = 2;
                            ctx.moveTo(1000, 250);//стрелка х
                            ctx.lineTo(985, 245);
                            ctx.lineTo(990, 250);
                            ctx.lineTo(985, 255);
                            ctx.lineTo(1000, 250);
                            ctx.moveTo(500, 1);//стрелка у
                            ctx.lineTo(505, 15);
                            ctx.lineTo(500, 10);
                            ctx.lineTo(495, 15);
                            ctx.lineTo(500, 1);
                            ctx.strokeText("X", 990, 270);
                            ctx.strokeText("Y", 530, 15);
                            ctx.strokeText("0",490,245);
                            numG = 10;
                            numV = 10;
                            ctx.stroke();
                            ctx.closePath();
                        }
 
                        function checkInitialValues(firstx, lastx, accuracy) {
                            if (!firstx && firstx != 0) return "Заполните начальное значение!"
                            if (!lastx && lastx != 0) return "Заполните конечное значение!"
                            if (lastx - firstx <= accuracy) return "Точность не может быть меньше интервала!";
                            if (firstx >= lastx) return "Начальное значение не может быть больше конечного!";
                            if (!accuracy && accuracy != 0) return "Заполните точность!";
                            if (accuracy < 0) return "Точность должна быть больше нуля!";
                            return null;
                        }
                        function evaluateFunction(functionId, x) {
                            if (functionId == 1) return (x* x - 20*Math.sin(x));
                            if (functionId == 2) return (5*Math.sin(x*2) - Math.sqrt(1-x))
                            if (functionId == 3) return (2*Math.log(x+7) - 5*Math.sin(x))
                            alert("Unknown function");
                        }
                        var state;
            var chord;
            var kosat;
                        function makeStep(m, ky, kx)//вычисление значений
                        {
                            var functionId = parseFloat(document.getElementById("functionsSelect").value)
                            var firstx = parseFloat(document.getElementById("startInput").value);
                            var lastx = parseFloat(document.getElementById("stopInput").value);
                            var accuracy = parseFloat(document.getElementById("accuracyInput").value);
                            //При изменении параметров начинаем с нуля
                            if (!state || state.functionId != functionId || state.firstx != firstx || state.lastx != lastx || state.accuracy != accuracy) {
                                drawer.init(m, kx, ky);
                                var errorMessage = checkInitialValues(firstx, lastx, accuracy);
                                if (errorMessage) {
                                    alert(errorMessage);
                                    return;
                                }
                                state = {
                                    firstx: firstx,
                                    lastx: lastx,
                                    accuracy: accuracy,
                                    currentX: firstx,
                                    functionId: functionId
                                };
                            }
                            if (state.currentX > lastx) {
                                drawer.finishDraw();
                                alert("Закончено");
                state = null;
                                return;
                            }
                            var step = 0.5;
                            var x = state.currentX;
                            var y = evaluateFunction(state.functionId, x);
                            state.currentX += step;
                            drawer.drawXY(x, y);
                        }
                        function reset()
                        {
                            state = null;
                            drawer.reset();
                        }
                        var ctx = can.getContext('2d');
                        var drawer = {
                            init: function (mash, koefY, koefX)
                            {
                                this.hasPrevPoint = false;
                                this.mash = mash;
                                this.kX = koefX;
                                this.kY = koefY;
                                this.reset();
                            },
                            reset: function () {
                                koord(this.mash);
                                ctx.beginPath();
                                ctx.strokeStyle = "red";
                                otv.value = null;
                            },
 
                            hasPrevPoint: false,
                            drawXY: function (x, y) {
 
                                if (!y && y != 0) {
                                    otv.value += "\n" + "Значение y не существует" + "\n" + "\n";
                                    return;
                                }
                               var y1 = (y > 0) ? 250 - parseFloat(y * this.kY) : 250 + parseFloat(Math.abs(y) * this.kY);
 
                                if (this.hasPrevPoint) {
                                    ctx.lineTo(500 + parseFloat(x * this.kX), y1);
                                    ctx.stroke();
                                }
                                else {
                                    ctx.moveTo(500 + parseFloat(x * this.kX), y1);
                                    this.hasPrevPoint = true;
                                }
 
                                otv.value += "x = " + x.toFixed(3) + " | y = " + y.toFixed(3) + "\n";
                            }
                            finishDraw: function () {
                                ctx.closePath();
                            }
                        }
                        function method_chord() {//модифицированый метод ньютона(метод хорд)
                            var x_next = 0;
                            var tmp = 0;
            ctx.closePath();
            functionId=parseFloat(document.getElementById("functionsSelect").value);
               firstx = parseFloat(document.getElementById("startInput").value);
                            lastx = parseFloat(document.getElementById("stopInput").value);
                           accuracy = parseFloat(document.getElementById("accuracyInput").value);
     if (!chord||chord.sh==null||chord.functionId != functionId||chord.firstxy!=firstx||chord.lastxy!=lastx) {ch.value = null;
                                chord= {
                                    firstx: firstx,
                firstxy: firstx,
                                    lastx: lastx,
                lastxy: lastx,
                                    accuracy: accuracy,
                                    currentX: tmp,
                x_next: x_next,
                sh:1,
                                    functionId: functionId
                                };
                            }
                            if(Math.abs(chord.x_next - chord.lastx) >accuracy)
                               { chord.currentX = chord.x_next;
                                chord.x_next = chord.lastx - evaluateFunction(functionId,chord.lastx) * (chord.firstx - chord.lastx) / (evaluateFunction(functionId,chord.firstx) - evaluateFunction(functionId,chord.lastx));
                                chord.firstx = chord.lastx;
                                chord.lastx = chord.currentX; 
                                ch.value += "prib = " + +chord.lastx.toFixed(9) + "\n";
                            var step = accuracy;
                            var x = chord.currentX;
                            var y = evaluateFunction(chord.functionId, x);
            var yy=evaluateFunction(chord.functionId, chord.x_next);
                            chord.currentX += step;
                            /*drawer.drawXY(x, y);*/
            ctx.beginPath();
           ctx.strokeStyle = "blue"; 
        if (y>0)   
                    y1=250-parseFloat(y*50);
                 else
                    y1=250+parseFloat(Math.abs(y)*50);
 
                 if (yy>0)   
                    y2=250-parseFloat(yy*50);
                 else
                    y2=250+parseFloat(Math.abs(yy)*50);  
 
                 ctx.moveTo((500+parseFloat(chord.currentX)), y1);
                 ctx.lineTo((500+parseFloat((chord.x_next)*50)), y2);ctx.closePath();
                            }else{alert("Вычисленно");}
                        }
 
                        function f(t) {//все функции
                            j = parseFloat(document.getElementById("functionsSelect").value);
                            var fu = (j == 1) ? ((-20)*Math.sin(t) + t*t):
                                         (j == 2) ? (5*Math.sin(2*t) - Math.sqrt(1-t)) :
                                       (2*Math.log(t+7) - 5*Math.sin(t));
                            return fu;
                        }
 
                        function df(t) {//производная
                        j = parseFloat(document.getElementById("functionsSelect").value);
                            var funct = (j == 1) ? (2*(t-10*Math.cos(t))):
                                        (j == 2) ? (10*Math.cos(2*t) +(1/(2* Math.sqrt(1-t)))) :
                                      ((2 /(t+7))) -5 * Math.cos(t));
                            return funct;
                        }
            function d2f(t) {//2 производная
                        j = parseFloat(document.getElementById("functionsSelect").value);
                            var funct = (j == 1) ? (20*Math.sin(t) + 2) :
                                        (j == 2) ? ((1/4) * Math.pow(Math.sqrt(1-t), -3) -20*Math.sin(2*t)) :
                                      (5*Math.sin(t)-(2/Math.pow((x+7),2)));
                            return funct;
                        }
 
                        function kos()
                        {functionId=parseFloat(document.getElementById("functionsSelect").value);
                            firstx = parseFloat(document.getElementById("startInput").value);
                            lastx = parseFloat(document.getElementById("stopInput").value);
                           accuracy = parseFloat(document.getElementById("accuracyInput").value);
                           var dx = 0, xn = 0,y1=0,y2=0;
                             if (!kosat||kosat.functionId != functionId||kosat.firstxy!=firstx||kosat.lastxy!=lastx) {
                             kosa.value = null;
                                kosat= {
                                    firstx: firstx,
                   firstxy: firstx,
                                    lastx: lastx,
                lastxy: lastx,
                                    accuracy: accuracy,
                                    currentX: dx,
                x_next: xn,
                sh:1,
                                    functionId: functionId};
                               if(f(firstx)*f(lastx)<0){
                if (f(kosat.firstx) * d2f(kosat.firstx) > 0)// для выбора начальной точки проверяем f(x0)*d2f(x0)>0
                                    kosat.x_next = kosat.firstx;
                                else kosat.x_next = kosat.lastx;}
                                else{alert("Корней нет");}}
 
                                if (Math.abs(kosat.x_next-kosat.currentX) >=accuracy) // пока не достигнем необходимой точности, будет продолжать вычислять
                                {   kosat.currentX=kosat.x_next;
                kosat.x_next = kosat.x_next - f(kosat.currentX) / df(kosat.currentX); // непосредственно формула Ньютона            var step = accuracy;
                            var x = kosat.currentX;
                            var y = evaluateFunction(kosat.functionId, x);
                            var yy = evaluateFunction(kosat.functionId, (kosat.x_next));
                            drawer.drawXY(x, y);
            kosa.value += "prib = " + +kosat.x_next.toFixed(9) + "\n";}else
            {alert("Выполнено");}
        }// вывод вычисленного корня
                    </script>
Ответ: HTML составляющая:
над скриптом
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8;" />
<link rel="stylesheet" type="text/css" href="set.css">  
 
        <table border="1px" bordercolor="white" align="center">
            <tr>
                <h1 align="center">Лабораторная 6</h1>
            </tr>
            <tr>
                <td>
                    <p align="center">
                        Выберите функцию
                        <select id="functionsSelect">
                            <option value="1">x* x - 20*Math.sin(x)=0</option>
                            <option value="2">5*Math.sin(2*t) - Math.sqrt(1-t))</option>
                            <option value="3">2*Math.log(t+7) - 5*Math.sin(t)</option>
                        </select>
                        Начальное значение:
                        <input type="text" id="startInput" /></br>
                        Примерное значение x:
                        <input type="text" id="stopInput" />
                        Точность:
                        <input type="text" id="accuracyInput" />
                        <input type="button" value="Сделать шаг" onclick="makeStep(50,50,50)" id="stepButton">
                        <input type="button" value="Сброс" onclick="reset()">
                    </p>
                </td>
            </tr>
            <tr>
                <td>
                    <canvas height=500 width=1050 id='can' style="color: red"></canvas>
Под скриптом
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
                </td>
                
                <td>
                 <textarea rows="10" cols="50" id="ch" readonly="1"></textarea>
                <input type="button" value="Метод хорд" onclick="method_chord()" >
                <textarea rows="10" cols="50" id="kosa" readonly="1"></textarea>
                <input type="button" value="Метод касательных" onclick="kos()" >
                </td>
            </tr>
 
            <tr>
                <td>
                    <p align="center">
                        <textarea rows="10" cols="50" id="otv" readonly="1"></textarea>
                    </p>
                </td>
            </tr>
 
        </table>
 
 
    </body>
</html>
Вопрос: Как асинхронно вызвать метод?

Пишу плагин для jQuery. В настройках плагина есть объект, содержащий метод render:

columns: {
            id: {
                name: '',
                isSearch: false,
                isSortable: true,
                render: function (content) {
                    return '<td>' + content[id] + '</td>';
                }
            },


В метод render передаю объект content. Код выполняется асинхронно.
Получаю ошибку:

ReferenceError: id is not defined


Код, из которого вызывается метод:

var request = ajax.index(settings);
request.done(function(result) {
            for (var column in result) {
                html += settings.columns[column].render(content);
            }
        }


Сам объект content:

Object { id=1, type="main", parameter="sitename", ...}


Мне нужно получить доступ к свойствам объекта content в методе render. Подскажите, пожалуйста, как правильно это сделать?
Ответ:
Сообщение от Erolast
Значит, объявляется, но не определяется.
В консоли написано undefined - значит, undefined. Браузеру виднее.

Могу сказать, почему в браузере - undefined. Выше писал, что код асинхронно работает. При инициализации настроек jQuery плагина метод render почему-то запускается, при этом никаких данных никто ему не отправлял.

Видимо это происходит при объединении настроек:
settings = $.extend(true, {}, defaults, options);


На данный момент я добавил еще один параметр async. При асинхронном вызове явно задаю параметр в true:

render: function (async, content) {
    if (async == true) return '<td>' + content.id + '</td>';
 }


Такой код работает, правда с костылем.
Вопрос: свойства/методы js

на сайте

есть список--свойства/методы,например-->document.addEventListener()

document--это свойство,а addEventListener() --метод ?

или вот еще --document.anchors-->anchors тоже метод (методы ж вроде обозначают скобками) ?
Ответ: всё, что в javascript'e пишется до точки -- это объект
всё, что прописано после точки --это свойство
но свойство может быть любого типа, в том числе и просто свойством, и объектом, и методом, и коллекцией, и событием
вот вам цепочка из трёх объектов (и двух свойств)
window.document.body
window -- это объект
document -- это тоже объект, но для объекта window объект document является свойством
body -- это тоже объект, но для объекта document объект body является свойством

кстати, document.anchors -- это свойство, являющееся коллекцией
Вопрос: <canvas> маска для картинки методом Clip()

есть 2 фигуры:
circle = new Image()
	circle.src = 'circle.png' 	
circle.onload = function() {
	ctx.rect(0, 0, 100, 100) // рисуем квадрат
	ctx.stroke()
	ctx.drawImage(circle, 75, 0) // выводим круг
}



маскируем круг квадратом, методом Clip() :
circle = new Image()
	circle.src = 'circle.png' 
circle.onload = function() {
	ctx.rect(0, 0, 100, 100)
	ctx.stroke()
	ctx.clip()
	ctx.drawImage(circle, 75, 0)
}

метод работает


загружаем 2 картинки:
square = new Image()
	square.src = 'square.png' 
	circle = new Image()
	circle.src = 'circle.png' 
circle.onload = function() {
	ctx.drawImage(square, 0, 0)	// выводим квадрат
	ctx.drawImage(circle, 75, 0) // выводим круг
}



маскируем круг квадратом:
square = new Image()
	square.src = 'square.png' 
	circle = new Image()
	circle.src = 'circle.png' 
circle.onload = function() {
	ctx.drawImage(square, 0, 0)	
	ctx.clip()
	ctx.drawImage(circle, 75, 0)
}

в результате выводится маска


возможно ли в качестве маски указать картинку PNG ?
или метод работает только с объектами rect(), arc() и т.п.

Ответ: provigator, clip() работает только с контуром (path). Есть методы для примитивных контуров rect(), arc(), и есть методы для создания контуров произвольной формы beginPath(), moveTo(), closePath(), lineTo(), quadraticCurveTo(), bezierCurveTo(), arcTo(). Контур сам по себе не отображается, его можно либо обвести stroke(), либо закрасить fill(), либо усечь clip() область рисования до его размеров и формы (изначально область рисования определена всей поверхностью холста). Обозначим контур усечения:
ctx.beginPath();
ctx.arc(50, 50, 50, 0, 2 * Math.PI);
ctx.drawImage(blue, 0, 0);
ctx.clip();
ctx.drawImage(orange, 75, 0);

В твоем же случае, вызов clip() на неопределенном контуре видимо порождает усечение области рисования до минимума, в связи с чем последующие изменения на холсте не видны.
Вопрос: Post запрос к файлу который использует методы wordpressa

Пишу плагин. В нем мне нужно использовать пост запрос к файлу с классом, который содержит встроянные методы wordpressa

вот файл по адресу dom.ru/wp-content/plugins/vkpb/classes/ParserPostVk.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php 
/**
 * Parser Post VK
 * все методы для работы плагина 
 */
 class parserPostVk
 {
    /* 
    * Проверка на существование рубрики
    * @id - id категории, int
    */
    function existCategory($id){
        $category = get_the_category_by_ID($id);
        if($category == ''){
            return false;
        } else {
            return true;
        }
    }
    
 } 
 
 $ppvk = new parserPostVk();
 $ppvk->existCategory(12);
 
 ?>
Обращаюсь к файлу на прямую.
Соответственно метод get_the_category_by_ID не известен. Ошибка. Как это обойти?
Ответ: Не нужно обращаться к файлу напрямую. Обращайтесь к url, который связан с движком.
Можно, конечно, загрузчик ядра заинклудить, но больше проблем будет потом, чем пользы.
У плагина должна быть функция или метод главного класса, который привязывается к определенному событию, в зависимости от назначения плагина. Собственно, там можно уже определять, какой класс / метод класса вызывать в зависимости от каких-либо условий. В вашем случае, проверять что в POST'е пришло и что-то делать, если там нужное.
Для ajax есть специальные функции.
Вопрос: Как выполнить метод импортируемого класса после загрузки картинок ?

У меня есть функция, которая прижимает футер. После того как переписал её на ES2015 возникли проблемы с отложенным запуском. Я использую import в webpack
Javascript
1
2
import Footer from './modules/footer';
footer = new Footer(),
А затем вызываю метод, используя jQuerry функцию 'load'
Javascript
1
2
3
$(window).on('load', function(){
    footer.fixFooter();
});
Высота высчитывается во вспомогательном методе setParam, после запуска fixFooter. Тем не менее это не работает ожидаемым образом. Высота зависит от того успели ли прогрузиться картинки. Помогите пожалуйста разобраться почему так происходит.

Вот код самой функции.
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
export default class {
 
    constructor (cms = 'bitrix', content = '.content') {
 
        this.cms = cms;
        this.content = $(content);
        this.headerHeight;
        this.footerHeight;
        this.vh = $(window).outerHeight(true);
        this.siteHeight;
        this.adminHeight;
 
    }
 
    _getAdminHeight() {
 
        switch (this.cms) {
            case 'bitrix':
                return $('#bx-panel').length ? $('#bx-panel').outerHeight(true) : 0;
            case 'emerald':
                return $('.adminTopPanel').length ? $('.adminTopPanel').outerHeight(true) : 0;
            default:
                return 0;
        }
 
    }
 
    _getContentHeight() {
 
        return this.content.outerHeight(true);
 
    }
 
    setParam() {
 
 
        this.headerHeight = $('header').outerHeight(true);
        this.footerHeight = $('footer').outerHeight(true);
 
//console.log(this.footerHeight);
        this.adminHeight = this._getAdminHeight();
        this.siteHeight = this.headerHeight +
                                            this.footerHeight +
                                            this.adminHeight +
                                            this._getContentHeight();
    }
 
    fixFooter() {
 
        this.setParam();
 
        if ( this.vh > this.siteHeight ) {
 
            var newHeight = this.vh - ( this.headerHeight + this.footerHeight + this.adminHeight );
            this.content.outerHeight(newHeight);
 
        } else { this.content.outerHeight('auto'); }
 
    }
 
}
Добавлено через 5 часов 8 минут
Ребят, я в ступоре. Просидел ещё час над кодом, пытаясь разобраться что же именно идёт не так.

Не могу понять почему метод возвращает неправильное значение высоты, причем в большую сторону ?! Бред какой то.
Для чистоты эксперимента привязал метод к классу в конструкторе и убрал jQuery.
Javascript
1
2
3
4
window.addEventListener('load', function(e){
    footer.fixFooter()
    setTimeout(footer.fixFooter, 1000);
});
Результат выполнения :



console.log выводит высоту футера
Javascript
1
2
this.footerHeight = $('footer').outerHeight(true);
console.log(this.footerHeight);
Весь код можно посмотреть на гитхабе
Ответ: Padimanskas Спасибо, возможно пригодится, хотя в данном случае и не совсем то.

В общем проблема не в классах и импортах. Я решил сделать по старинке версткой, а через JS выставлять нужную высоту. Изменил верстку и подобрал оптимальный на мой взгляд метод, достаточно менять одно свойство.

2 строчки кода:

Javascript
1
2
3
4
5
6
$(window).on('load', function(){
 
    var footerHeight = $('footer').outerHeight(true);
    $('.content').css('min-height', 'calc(100vh - '+footerHeight+'px)');
    
});
Это не работает ожидаемым образом. В footerHeight приходит значени больше фактического!

Видимо что то идёт не так в момент сборки webpack`ом, т.к. если в консоли запустить этот код или через setTimeout dc` работает. Но что именно, ведь делаются элементарные манипуляции с дом ?! Возможно как то влияет webpack-spritesmith . Он собирает картинки в спрайты и генерирует переменные для их вставки через миксин. Но ведь css подгружается раньше к тому же значение высоты БОЛьше а не меньше ожидаемого.

Откуда выросли эти 14px мне до жути интересно и по хорошему всё нужно проверять в отдельности. Но я больше не могу тратить на это время.