document.querySelectorAll('a').forEach(a=>{
if(!a.href || !(a.href.indexOf('http')===0)) return;
let href = a.href;
a.removeAttribute('href');
a.addEventListener('click',e=>{
location.href = href;
});
});
document.querySelectorAll('a').forEach(a=>{
//a.style.backgroundColor = 'red'; //красным проигнорированные
if (a.href && a.href.indexOf('javascript:') === 0) {
//a.style.backgroundColor = '#ff0'; //желтым скриптованные ссылки
let eval_str = a.href.substr(11);
a.addEventListener('click',e=>{
eval(eval_str);
});
a.removeAttribute('href');
return;
}
if(!a.href || !(a.href.indexOf('http')===0)) return;
let c = a.className;
if (c.indexOf('button') > -1 || c.indexOf('btn') > -1 || c.indexOf('like') > -1 || c.indexOf('reply') > -1) return;
if (a.querySelector('svg') || a.querySelector('img')) return;
if (a.style.borderRadius) return;
//a.style.backgroundColor = '#0f0'; //зеленым очищенные ссылки
let href = a.href;
a.removeAttribute('href');
a.addEventListener('click',e=>{
location.href = href;
});
});
document.getElementById("myselect").addEventListener("change",
function () {
let opt;
for(let i=0;i<this.children.length;i++){
let child = this.children[i];
if(this.value == child.value) {
opt = child;
break;
}
}
if(!opt)return;
let for_attr = opt.getAttribute("data-price") || "???";
document.getElementById('mydiv').innerHTML = "Вес брутто*: "
+ for_attr;
}
);
let modal = document.getElementById('modal');
let modal2 = document.getElementById('modal2');
function commonFn(e) {
e.style.display = "block";
}
link.onclick = function() {
commonFn(modal);
}
link2.onclick = function() {
commonFn(modal2);
}
let modal = document.getElementById('modal');
let modal2 = document.getElementById('modal2');
let links = [link, link2];
let modals = [modal, modal2];
links.forEach((L,i)=>L.onclick = function() {
modals[i].style.display = "block";
});
.onclick=
лучше использовать .addEventListener('click',
onclick = "func_1()"
document.getElementsByTagName('button')[0].addEventListener('click',func_1);
addThumbnailClickHandler(thumbnails[i], photos[i])
происходит прямо в цикле, сразу, без промедлений, а не откладывается на потом. В этот момент конкретные значения передаются в качестве параметров. И далее из-за замыкания они так и остаются висеть в памяти и ссылаться на то, что нужно.var i;
var addThumbnailClickHandler = function (thumbnail) {
thumbnail.addEventListener('click', function () {
fullPhoto.src = photos[i]; // i === thumbnails.length
});
};
for (i = 0; i < thumbnails.length; i++) {
addThumbnailClickHandler(thumbnails[i]);
}
const hashes = [ DIV:1, P:1, SPAN:1, ... ];
if (hashes[el.nextSibling.nodeName]) {
...
function funcCounter(num) {
let cnt = this.cnt || 0; //Создаем счетчик вызовов
cnt++; //увеличиваем счетчик вызовов
this.cnt = cnt; //Запоминаем счетчик
if (typeof num != "number" || !isFinite(num)) return cnt;
if (num < 100) { //вызовы от этого числа
if (cnt >= num) return cnt - num;
return 0;
}
if (num > 100) { //от 0 до числа
if (num < cnt) return num;
return cnt;
}
return cnt; //num is 100
}
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.type == "myMessage") { //можно обойтись без типов
let v = request.v; //12345
// ...что-то сделать
sendResponse({answer: 'ok'}); //не обязательно
}
}
chrome.runtime.sendMessage({
type: "myMessage", //тип сообщения, если их несколько
v: 12345, //какие-то данные нужно переслать в background
}, function(data) { //callback, если нужно
if (data.answer == 'ok') console.log('всё в порядке');
}
});