Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Написание Chrome extention (plugin)

Захотелось попробовать написать плагин для хрома, и тут же столкнулся с такой проблемой: зайдя на сайт ВК, у меня должен отправиться запрос на другой сайт. Но проблема в том, что вк работает по хттпс, а другой сайт по хттп, из за этого он не может отправить запрос. Как можно обойти это?
Ответ: У меня как к https так и к http подключается
Вопрос: расширение chrome, js не работает

манифес
{
    "name" : "MDK lite", 
    "version" : "1.0", 
    "description" : "This is a simple chrome extention",
    "manifest_version" : 2,
	"permissions": [ "tabs" ],
    "browser_action" : {
        "default_title" : "test ", 
        "default_icon" : "images/icon.png", 
        "default_popup" : "popup.html" 
    },
	 "web_accessible_resources": [
     "/injected.js"
    ],
	"content_scripts": [
    {
      "matches": ["http://google.com"],
      "js": [ "jquery.js", "background.js" ],
	  "run_at": "document_end"
	 
    }
   ]
}


popup
<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8" >
</head>

<script>
alert(1);
</script>
/* пара таблиц*/


javascript отказывается работать, на станице popup пробовал по разному - никак не не работает\

по какой причине так?
Ответ: у меня точно такая же проблема(
Вопрос: Встраивание контента из расширения chrome

Делаю расширение под google chrome.
По нажатию на кнопку расширения встраиваю в содержимое текущей открытой страницы дополнительный код:
chrome.extension.onConnect.addListener(function(port) {
	port.onMessage.addListener(function() {
		if(!document.getElementById("yImgDropBox")) {
			// jquery
			var jqscript = document.createElement("script");
			jqscript.setAttribute("type", "text/javascript");
			jqscript.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js");
			document.getElementsByTagName("head")[0].appendChild(jqscript);
			// плагин
			var dbscript = document.createElement("script");
			dbscript.setAttribute("type", "text/javascript");
			dbscript.setAttribute("src", chrome.extension.getURL("dropbox.js"));
			document.getElementsByTagName("head")[0].appendChild(dbscript);
			// стиль
			var dbstyle = document.createElement("link");
			dbstyle.setAttribute("type", "text/css");
			dbstyle.setAttribute("rel", "stylesheet");
			dbstyle.setAttribute("href", chrome.extension.getURL("dropbox.css"));
			document.getElementsByTagName("head")[0].appendChild(dbstyle);
			// Объект для работы плагина
			var dbobj = document.createElement("div");
			dbobj.setAttribute("id", "yImgDropBox");
			dbobj.innerHTML = 'click twice';
			document.getElementsByTagName("body")[0].appendChild(dbobj);
		}
		var newEvent = new CustomEvent('yImgDropBoxStart', {'detail': {'yImgToken': '111'}});
		window.dispatchEvent(newEvent);
		});
	});
});


В файле плагина делаю инициализацию

$(window).on('yImgDropBoxStart', function(event) {
	var receivedToken = event.detail.yImgToken ? event.detail.yImgToken : event.originalEvent.detail.yImgToken;
	console.log('plugin inited');
});


Проблема в том, что после первого нажатия на кнопку расширения все, что нужно, корректно встраивается в содержимое открытой страницы. Но сообщение не отрабатывается. Если нажать на кнопку расширения еще раз - плагин получает сообщение и все работает дальше нормально.
Почему обработка сообщения не выполняется сразу после первого нажатия?
Ответ: Давно не возвращался к проблеме, сейчас вот вернулся
Пока разбирался, понял, что видимо подключение как jquery так и собственных js-плагинов требует времени для браузера. Т.е. встраиваются ссылки на них в страницу сразу а еще нужно дождаться полной загрузки js-файла.
В общем пока получилось примерно такое решение проблемы:
chrome.extension.onConnect.addListener(function(port) {
	port.onMessage.addListener(function(message) {
		if(!document.getElementById("yImgDropBox")) {
			// Внедрить jquery
//			if(!window.jQuery) {
				var jqscript = document.createElement("script");
				jqscript.setAttribute("type", "text/javascript");
				jqscript.setAttribute("id", "jqueryminjs");
				jqscript.setAttribute("src", "https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js");
				document.getElementsByTagName("html")[0].appendChild(jqscript);
//			}
			// Только после загрузки jquery
			document.getElementById("jqueryminjs").onload = function() {
				var dbscript = document.createElement("script");
				dbscript.setAttribute("type", "text/javascript");
				dbscript.setAttribute("id", "dropboxplugin");
				dbscript.setAttribute("src", chrome.extension.getURL("dropbox.js"));
				document.getElementsByTagName("html")[0].appendChild(dbscript);
				// Только после загзуки плагина dropbox.js
				document.getElementById("dropboxplugin").onload = function() {
					// стиль
					var dbstyle = document.createElement("link");
					dbstyle.setAttribute("type", "text/css");
					dbstyle.setAttribute("rel", "stylesheet");
					dbstyle.setAttribute("href", chrome.extension.getURL("dropbox.css"));
					document.getElementsByTagName("head")[0].appendChild(dbstyle);
					// Объект для работы плагина
					var dbobj = document.createElement("div");
					dbobj.setAttribute("id", "yImgDropBox");
					dbobj.innerHTML = 'not ready';
					document.getElementsByTagName("body")[0].appendChild(dbobj);
					// Отправить событие для инициализиции плагина
					chrome.storage.sync.get('yImgToken', function(responce) {
						if(responce.yImgToken) {
							var newEvent = new CustomEvent('yImgDropBoxStart', {'detail': {'yImgToken': responce.yImgToken}});
							window.dispatchEvent(newEvent);
						}
					});
				}
			}
		}
	});
});
Вопрос: Расширение под Google Chrome

Подскажите пожалуйста как в расширение под google chrome работает background_page, и когда он запускается, я нашел что запускается только один раз при старте браузера, прописал в манифесте
"background": {
"scripts": ["background.js"]
} только вот скрипт в принципе не запускается, написал для примера самый простой код console.log("1213");
но ничего в консоль не выводится, подскажите пожалуйста, когда страничка должна загружаться
Ответ: Без полного кода сложно предположить что у тебя за расширение и почему оно не работает.

Возможно ты просто смотришь не в ту консоль (у каждой страницы есть своя консоль)

Для того что бы открыть консоль расширения chrome нужно перейти на страницу "chrome://extensions/" в списке расширений найти свое расширение и чуть ниже будет строка «Проверить режимы просмотра: фоновая страница» нажатие на эту ссылку открывает нужную консоль
Вопрос: Новинки внутри браузера Chrome

Какие полезности можно использовать в Chrome, которых нет в обычном JS?
Ответ: _Alex9_,
??? К примеру Chrome ES6-ready. так что можно уже использовать всякую ново-стандартную фигню
Вопрос: запустить службу windows из google chrome

Есть служба ее нужно стартовать из браузера.

Запуск службы хотел сделать через командную строку. В Chrome ActiveX не поддерживается. Тут
выxитал, что надо использовать NPAPI.



разработал DLL, которая стартует службу через командную строку, разобрался как подключить плагин в Chrome. Но вот сам плагин в Chrome не работает.

Плагин запускаю так
<embed type="application/x-myGooglePlugin" id="pluginId">
<script>
  var plugin = document.getElementById("pluginId");
  var result = plugin.start();  // call a method in your plugin
  console.log("my plugin returned: " + result);
</script>


в консоли ошибка
Uncaught TypeError: plugin.start is not a function

Стал разбираться натолкнулся на инфу, что NPAPI устарел

как быть? может есть другой путь как стартовать службу из браузера?
Ответ: nikomp,

Нельзя. Но можно через HTTP-интерфейс.
Вопрос: Глобальные переменные в расширении Chrome

Сделал совсем простое расширение для Chrome: по нажатию комбинации клавиш добавляет URL текущей вкладки в подобие блокнота. Сохраненные URL хранятся в глобальной переменной, которая объявляется в фоновом скрипте background.js (как я думал он исполняется только один раз при загрузке расширения). Так вот эта переменная периодически сбрасывается, то есть скрипт background.js периодически перезагружается. Почему? Как этого избежать? Или где объявить переменную что бы она не сбрасывалась пока запущен браузер или загружено расширение.

manifest.json
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
{
    "name": "Имя",  //имя
    "description": "Описание",  //описание
    "version": "1.0",   //версия расширения
 
    "content_scripts":
    [
        {
            "all_frames": true, //er546
            "matches": ["*://*/*"], //вставляем на все страницы
            "js": ["hotkeys.js"],   //, //скрипт, добавляющий поддержку горячих клавиш
            "run_at": "document_end"
        }
    ],
    "permissions":  //
    [
        "tabs"
    ],
    "background":
    {
        "persistent": false,
        "scripts": ["background.js"]    //скрипт работающий в фоновом режиме
    },
    "browser_action":
    {
        "default_icon": "icon.png",
        "default_popup": "popup.html"
    },
    "manifest_version": 2   //версия манифеста
}
popup.js
Javascript
1
2
3
4
5
6
7
8
9
10
//alert("alert");
 
var alluri = chrome.extension.getBackgroundPage().allurl;
document.getElementById('edit1').textContent = alluri;
 
 
chrome.browserAction.onClicked.addListener(function(callback)
    {
        document.getElementById('edit1').textContent = chrome.extension.getBackgroundPage().allurl;
    });
hotkeys.js
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
if (!EXT_HOTKEY_JS_INSERTED)
{
    var EXT_HOTKEY_JS_INSERTED = true;
    var hotkeys = '';
    var messages = '';
    var timeout = '';
    
    document.addEventListener('keydown', event_handleKeyDownEvent, true);
 
    function event_handleKeyDownEvent(e)
    {
        var c=0;
        var a=0;
        var s=0;
        var k = e.keyCode;
        if (e.shiftKey) s = 1;
        if (e.altKey) a = 1;
        if (e.ctrlKey) c = 1;
        if ((k==49) && (!c) && (!s) && (a))
        {
            var luri = window.document.documentURI;
            chrome.runtime.sendMessage({greeting: "adduri", uri: luri}, function(response)
            {
            }); 
        };
    };
};
background.js
Javascript
1
2
3
4
5
6
7
8
9
10
//alert("background.js");
var allurl;
 
chrome.runtime.onMessage.addListener(function(request, sender, callback)
{
    if (request.greeting=="adduri")
    {
        allurl = allurl + request.uri + String.fromCharCode(13) + String.fromCharCode(10);
    };
});
popup.html
Javascript
1
2
3
4
5
6
7
8
9
10
<html>
    <head>
        <meta charset="utf-8">
        <title>Мои заметки</title>
    </head>
    <body>
        <textarea id="edit1" cols=35 rows=20></textarea>
    </body>
    <script src="popup.js"></script>
</html>
Ответ: А вот и нет . Если бы это было так меня бы все устроило, именно на это я и рассчитывал при написании расширения, но...
В моем случае по какой-то причине скрипт background.js выполняется когда посылается сообщение, обработчик которого объявлен в background.js (но не каждый раз, а через некоторый период времени, около минуты).

Добавлено через 6 минут
Обратите внимание на листинг background.js, который я выложил. Если раскоментировать первую строку, то окно сообщения будет всплывать не один раз при загрузке расширения, а случайным образом при нажатии Alt+1 (этой комбинацией посылается сообщение для сохранения URL текущей вкладки).
Вопрос: Есть сайт https + мое расширение Chrome + Звук

Здравствуйте.
Есть сторонний сайт по протоколу https
как можно организовать звук в моем расширении для chrome (меня интересует чтоб по какому-то событию была моя функция на JavaScript) проигрался короткий звуковой файл?
устроит и вариант загрузки звукового файла с локального сервера (на денвере)?

сильно не силен ни в javascripts ни в написаниях расширений для хрома, помогите плиз!
Ответ: с http разобрался но сделал так как мне надо
а именно, в коде javascripts который включается в сторонний сайт http
сделал функцию
function PlaySound(FNamePlay) {
	
  		var iframe = document.createElement("iframe");
		iframe.name = 'probasound';
		iframe.src = 'http://localhost/PlaySound.php?PlayMusic='+FNamePlay;	
        document.body.appendChild(iframe);		

}


а файл PlaySound.php содержит


Цитата:
<html>
<body>
<?php
$Command=$_GET['PlayMusic'];
print 'Играем файл: '+$Command;
?>
<audio autoplay>
<source src="/<? print "$Command.wav"?>" type='audio/wav'>
</audio>

</body>
</html>
то, что сделал через локалхост впринципе можете вставить и на любой хостинг, но мне надо на локалхост, т.к. 1 расширение будет работать на нескольких сайтах...ну вообщем по потребностям

каждый раз при запуске PlaySound
создается новый iframe
ну сделал на скорую руку, думаю есть и более изящный способ
Вопрос: jQuery Validation Plugin для динамических input на форме

Здравствуйте уважаемые форумчане.

Динамически добавляю на форму input следующего вида:
<input type="text" name="input_name[]" />

Но не могу сообразить, как можно применить jQuery Validation Plugin к этим динамически добавленным полям?

rules: {
input_name[]: {},
}


Делает валидацию только для первого добавленного поля, для остальных уже не применяется.
Ответ: Уже сам сообразил...
Вопрос: Нужна помощь с доработкой скрипта расширения под Chrome

Всем доброго времени суток!
Ребята выручайте, неделю воюю, но опыта 0. Делаю расширение для рабочего сайта. Расширение само по себе блокирует возможность открывать более чем задано количество вкладок в окне браузера.
Реализованный алгоритм, на данный момент, его таков: Есть 1 вкладка с главным сайтом на котором есть 2 кнопки -> при попытке открыть новое окно оно закрывается через N секунд. -> когда новая вкладка закрывается, главная страница автоматически обновляется.
Мне нужно что бы после обновления страницы, нажималась кнопка id=0.
Вот кнопка:
<button class="button" type="button" data-href="https://sportloto.com.ua/#sports" data-index="0" id="0">Ставки на спорт</button>


manifest.json:
{
    "name": "Tab Limit",
    "description": "Limit the number of open, non-pinned browser tabs",
    "version": "0.1.0",
	
    "background": {
        "scripts": ["background.js"]
    },

    "permissions": [
        "tabs"
		
    ],
    "browser_action": {
        "default_icon": {
            "19": "icons/19.png",
            "38": "icons/38.png"
        },
        "default_title": "Tab Limit"
    },
    "icons": {
        "48": "icons/48.png",
        "128": "icons/128.png"
    },
    "manifest_version": 2
}

background.js:
var isEnabled = true;
var maxTabs = 1;
var tabsCount;


function updateBadgeText() {
    var tabsBalance = maxTabs - tabsCount;
    var tabsAllowanceRemaining = (tabsBalance > 0) ? tabsBalance : 0;

    chrome.browserAction.setBadgeText({
        text: "" + tabsAllowanceRemaining
		
    });
	
}

function updateTabsCount() {
	
    chrome.tabs.query({
        windowType: 'normal',
        pinned: false
    }, function (tabs) {
        tabsCount = tabs.length;
        updateBadgeText();
    });
}

function handleTabCreated(tab) {
   if (tabsCount >= maxTabs) {
		setTimeout(function() {
        chrome.tabs.remove(tab.id);
		}, 2000);	
	}
    else {
        updateTabsCount();
    }
}

function handleTabClick() {
	
			setTimeout(function() 	{
				
		}, 5000);
}

function handleTabRemoved(tab) {
    updateTabsCount();
	chrome.tabs.reload(tab.id);
		handleTabClick();
	}

function handleTabUpdated(tab) {
    updateTabsCount();
}


function init() {
    updateTabsCount();
    chrome.tabs.onCreated.addListener(handleTabCreated);
    chrome.tabs.onRemoved.addListener(handleTabRemoved);
    chrome.tabs.onUpdated.addListener(handleTabUpdated);
	}

function teardown() {
    chrome.tabs.onCreated.removeListener(handleTabCreated);
    chrome.tabs.onRemoved.removeListener(handleTabRemoved);
    chrome.tabs.onUpdated.removeListener(handleTabUpdated);
	}

chrome.browserAction.onClicked.addListener(function (tab) {
    if (!isEnabled) {
        init();
        chrome.browserAction.setIcon({ path: "icons/19.png" });
	}
    else {
        teardown();
        chrome.browserAction.setIcon({ path: "icons/19-disabled.png" });
        chrome.browserAction.setBadgeText({ 'text': '' });
  }

    isEnabled = !isEnabled;
});


init();


Соответствено пробовал все что нашел в Google и тут на сайте. Ничего не вышло. В консоли браузера все отлично работает. Подставляю в расширение, ноль.
function handleTabClick() {
	
			setTimeout(function() 	{
				
		}, 5000);
}

В эту же форму вставляю Alert('111'); для проверки, сообщение как положено выводится через 5 секунд. Вставляю
document.getElementById('0').click();

или
document.getElementByClassName('button')[0].click();

Ничего не работает
Ответ: Попытался, по совету реализовать.
//background.js
function handleTabRemoved(tab) {
    updateTabsCount();
	chrome.tabs.reload(tab.id);
	began();
	}
	
function began() {

  chrome.runtime.sendMessage({greeting: 'hello'}, function(response) {
      console.log(response.msg); /*При необходимости получаете ответ*/
    });
}

//content.js
function handleTabClick() {
	
		setTimeout(function() 	{
				document.getElementById('0').click();
		}, 5000);
}

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    if (request.greeting == 'hello'){
    alert('111');
/*Можете отправить ответ, если необходимо*/

      sendResponse({msg: 'Update'});

    }

  });
но не работает... Сообщение не выводится...