Нужен важный совет по разработке Chrome Extension - PullRequest
1 голос
/ 30 июня 2011

Извините за смутное название, я постараюсь быть как можно более конкретным для описания.

Если вы посмотрите на мой предыдущий вопрос на этом сайте, вы увидите, что я попросил совета о том, как заполнить контекстные меню Chrome. Причина, по которой я использую контекстные меню, заключается в том, что мне нужен простой в доступе интерфейс, который предоставляет пользователю список значений. Эти значения представляют различные типы документов (например, свидетельство о рождении или налоговый отчет). Каждый из этих документов имеет уникальные атрибуты (например, свидетельство о рождении «Свидетельство о рождении» и «Удостоверение») и правила. Эти атрибуты и правила используются, когда мне нужно загрузить файлы в DMS (систему управления документами), которая в основном является веб-сайтом ASP.Net. Текстовые поля и выпадающие списки используются для получения правил и атрибутов, которые я упоминал ранее. Обычно при добавлении файла мне приходится заполнять эти поля вручную в зависимости от типа документа, что занимает очень много времени.

Теперь, что я хочу сделать, это просто иметь возможность щелкнуть по одному из пунктов моего контекстного меню (опять же, скажем, я нажимаю «Свидетельство о рождении»), и поля на странице будут автоматически обновляется соответствующими значениями.

То, что я сделал до сих пор, это поместил большинство пунктов меню / типов документов и их соответствующие атрибуты / правила в формат JSON. Мое первоначальное намерение состояло в том, чтобы установить значения полей страницы с помощью скрипта, включенного в расширение контекстного меню. Только если я не ошибаюсь (если да, скажите, пожалуйста), вы не можете изменять значение элементов HTML на веб-странице напрямую через расширение Chrome.

Насколько я понимаю, пользовательский скрипт мог бы выполнить эту задачу, но я все еще хочу иметь интерфейс управления (контекстное меню) для выбора типа документа (я не хочу, чтобы скрипт всегда выполнялся с те же параметры).

Итак, из того, что я описал, что бы вы сказали, это лучший способ решить эту задачу? Могу ли я «вызвать» usercript или хотя бы передать какой-нибудь параметр, чтобы я мог изменять значения текстовых полей / выпадающих списков по своему желанию? Любой совет очень weclome.

P.S. Я проверил некоторый скрипт, чтобы увидеть, могут ли поля действительно изменять свои значения программно Я просто скопировал и вставил код (с некоторыми предопределенными значениями для полей) в адресную строку с префиксом «javascript:», и он работает как шарм! Теперь мне просто нужно

  • 1) Уметь делать это без использования этого трюка с адресной строкой и
  • 2) иметь реальный интерфейс для выбора значений вместо простого их кодирования.

1 Ответ

1 голос
/ 30 июня 2011

Только, если я не ошибаюсь (если я, скажите, пожалуйста), вы не можете изменять значение элементов HTML на веб-странице напрямую через расширение Chrome.

Конечно, они могут. Изучите скрипты содержимого , которые можно настроить для автоматического внедрения на сайты, которые соответствуют указанному шаблону . Вы также можете сделать программный впрыск через chrome.tabs.executeScript. Расширения Chrome имеют доступ к гораздо большему количеству инструментов, чем пользовательские сценарии.

Вы бы просто использовали любой обратный вызов onclick, который вы установили при создании контекстного меню , тогда вы бы запустили:

chrome.tabs.executeScript(null, { file: "script_to_inject.js"});

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

Простой пример

manifest.json (добавьте это в ваши разрешения)

"permissions": [ "http://*/*" ],

script_to_inject.js

chrome.extension.sendRequest("options", function(response) {
  alert(response.birthday); // Alerts the birthday in the response
  alert(response.name);     // Alerts the name in the response
  document.getElementById("some_field_id").value = response.name;
});

background.html (или background.js)

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  switch (request) {
    case "options":
      sendResponse({birthday: "1/1/1970", name: "Unix"});
      break;
    default: // Add other cases as you see fit
      sendResponse({});
      break;
  }
});
...