Запуск модального сценария контента [дубликат]

Да, поскольку все эти действия могут выполняться обычными SQL-запросами.

Однако я бы воздержался от запуска PHP-скриптов с подключением к базе данных от пользователя root.

24
задан kucherenkovova 4 October 2016 в 09:31
поделиться

5 ответов

Поскольку я недавно прошел перчатку этой проблемы, я хочу поделиться некоторой информацией, которая мне кажется ценной.

Во-первых, ответ Роба верен. Тень DOM - правильное решение этой проблемы. Однако в моем случае мне не только нужна изоляция CSS, но также нужны события JavaScript. Например, что произойдет, если пользователь нажмет кнопку, которая живет в изолированном HTML? Это становится действительно уродливым только с Shadow DOM, но у нас есть другая технология веб-компонентов, Custom Elements, для спасения. За исключением того, что на момент написания этой статьи есть ошибка в chrome, которая предотвращает создание пользовательского элемента в chrome-расширениях. Здесь мои здесь и здесь и здесь есть ошибка .

Итак, где же это остается? Я считаю, что лучшим решением сегодня является IFrames, с которым я и пошел. Статья shahalpk связана велика, но она описывает только часть процесса. Вот как я это сделал:

Сначала создайте html-файл и js-файл для вашего изолированного виджета. Все внутри этих файлов будет работать в изолированной среде в iframe. Не забудьте загрузить файл js из html-файла.

//iframe.js
var button = document.querySelector('.my-button');
button.addEventListener('click', function() {
    // do useful things
});

//iframe.html
<style>
/* css */
</style>
<button class='my-button'>Hi there</button>
<script src='iframe.js'></script> 

Затем внутри вашего скрипта содержимого создайте элемент iframe в javascript. Вам нужно сделать это в javascript, потому что вам нужно использовать chrome.extension.getURL, чтобы захватить ваш файл iframe html:

var iframe = document.createElement('iframe');
iframe.src = chrome.extension.getURL("iframe.html");
document.body.appendChild(iframe);

И все.

имейте в виду: если вам нужно обмениваться информацией между iframe и остальной частью сценария контента, вам нужно выполнить chrome.runtime.sendMessage () на фоновой странице, а затем chrome.tabs.sendMessage с фоновой страницы обратно на вкладку , Они не могут напрямую общаться.

EDIT: я написал сообщение в блоге, в котором подробно описывалось все, что я узнал в моем процессе, включая полное расширение chrome примера и множество ссылок на различную информацию:

https://anderspitman.net/blog/chrome-extension-content-script-stylesheet-isolation/

В случае, если мой блог не работает, вот источники исходного сообщения :

Запись в блоге

Пример источника

7
ответ дан anderspitman 17 August 2018 в 09:30
поделиться
  • 1
    Звучит здорово, к сожалению, эта ссылка на ваш пост в блоге мертва, давая 403 Forbidden. – Joko 16 January 2018 в 15:44
  • 2
    Извини за это. Я добавил несколько новых ссылок. – anderspitman 16 January 2018 в 18:15
  • 3
    Кстати, как упоминалось в этом сообщении в блоге, вы можете посмотреть в мою библиотеку chromeps, чтобы обрабатывать передачу сообщения. Это сообщение в блоге объясняет это – anderspitman 16 January 2018 в 18:21

Использовать all

.some-selector {
    all: initial;
}

.some-selector * {
    all: unset;
}

или использовать Shadow DOM

Library

function Widget(nodeName, appendTo){
  this.outer = document.createElement(nodeName || 'DIV');
  this.outer.className = 'extension-widget-' + chrome.runtime.id;
  this.inner = this.outer.createShadowRoot();
  (appendTo || document.body).appendChild(this.outer);
}

Widget.prototype.show = function(){
  this.outer.style.display = 'block';
  return this;
};

Widget.prototype.hide = function(){
  this.outer.style.display = 'none';
  return this;
};

Использование

var myWidget = new Widget();
myWidget.inner.innerHTML = '<h1>myWidget</h1>';

Вы можете получить доступ к содержимому виджета через myWidget.inner и внешний через myWidget.outer.

Стили

/* 
 * Reset Widget Wrapper Element 
 */
.extension-widget-__MSG_@@extension_id__ {
  background: none;
  border: none;
  bottom: auto;
  box-shadow: none;
  color: black;
  cursor: auto;
  display: inline;
  float: none;
  font-family : "Helvetica Neue", "Helvetica", "Arial", sans-serif;
  font-size: inherit;
  font-style: normal;
  font-variant: normal;
  font-weight: normal;
  height: auto;
  left: auto;
  letter-spacing: 0;
  line-height: 100%;
  margin: 0;
  max-height: none;
  max-width: none;
  min-height: 0;
  min-width: 0;
  opacity: 1;
  padding: 0;
  position: static;
  right: auto;
  text-align: left;
  text-decoration: none;
  text-indent: 0;
  text-shadow: none;
  text-transform: none;
  top: auto;
  vertical-align: baseline;
  white-space: normal;
  width: auto;
  z-index: 2147483648;
}

/* 
 * Add your own styles here 
 * but always prefix them with:
 * 
 *   .extension-widget-__MSG_@@extension_id__ 
 *   
 */

.extension-widget-__MSG_@@extension_id__{
  position: fixed;
  top: 100px;
  margin: 0 auto;
  left: 0;
  right: 0;
  width: 500px;
}

.extension-widget-__MSG_@@extension_id__::shadow h1 {
  display: block;
  margin: 0 auto;
  padding: 20px;
  background-color: yellow;
  border: 10px solid green;
  font-size: 20px;
  text-align: center;
}
5
ответ дан HaNdTriX 17 August 2018 в 09:30
поделиться
  • 1
    Shadow DOM очень сложный, когда дело касается обработки событий. Я пытаюсь использовать React + Shadow DOM, чтобы изолировать расширение и все еще не удалось привязать обработчик события к внутренней DOM. – Yuanfei Zhu 22 December 2015 в 06:45
  • 2
    Я сделал то же самое. В конце концов я понял, что реагирующие и теневые домики плохо работают вместе. Хороший старый iframe по-прежнему является лучшим вариантом, когда дело доходит до инкапсуляции. – HaNdTriX 22 December 2015 в 15:29
  • 3
    Приятно слышать, что кто-то со мной. Но кажется, что если вы используете iframe, сообщение, проходящее между хостом и содержимым iframe, может быть довольно сложным. Как вам это удается? – Yuanfei Zhu 23 December 2015 в 04:10

Недавно я создал Boundary, библиотеку CSS + JS для решения таких проблем. Граница создает элементы, которые полностью отделены от CSS существующей веб-страницы.

Возьмите создание диалогового окна, например. После установки Boundary вы можете сделать это в своем скрипте содержимого

var dialog = Boundary.createBox("yourDialogID", "yourDialogClassName");

Boundary.loadBoxCSS("#yourDialogID", "style-for-elems-in-dialog.css");

Boundary.appendToBox(
    "#yourDialogID",
    "<button id='submit_button'>submit</button>"
);

Boundary.find("#submit_button").click(function() {
  // some js after button is clicked.
});

Элементы в #yourDialogID не будут затронуты существующей веб-страницей. И функция find () возвращает регулярный элемент DOM jQuery, чтобы вы могли делать с ним все, что хотите.

Надеюсь, это поможет. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.

https://github.com/liviavinci/Boundary

4
ответ дан Livia Zhang 17 August 2018 в 09:30
поделиться
  • 1
    Хорошо! Теперь это гораздо лучший ответ. (Хотя вы должны вынуть метку фрагмента, это не полезно) – Xan 17 October 2014 в 19:56
  • 2
    @Xan это первый раз, когда я когда-либо отправлял ответ на stackoverflow, поэтому большое спасибо за руководство! – Livia Zhang 17 October 2014 в 19:58

Во время запроса вопроса единственным вариантом было либо использовать iframes, либо таблицы стилей с очень высокой спецификацией и явно задать все свойства, которые могут повлиять на стили. Последний метод очень громоздкий, потому что всегда будет какое-то свойство, которое вас упускает. Следовательно, единственным используемым методом для выделения таблиц стилей было использование iframes.

Решение этой проблемы - устранение стилей без iframes - Shadow DOM ( с Chrome 25 [/ д2]). Вы можете найти учебник в HTML5 Rocks . Для реального расширения Chrome, использующего Shadow DOM для выделения стилей, см. Экран #Anchors ( здесь ).

19
ответ дан Rob W 17 August 2018 в 09:30
поделиться
  • 1
    Это расширение Display #Anchors поставляется очень удобно (например, для привязки к определенным разделам документов расширенных Chrome);) – gkalpak 27 November 2013 в 17:03
  • 2
    также используя Sass like: #myid { .all-my-extension-styles ... } может потенциально решить эту проблему? – bboydflo 22 May 2018 в 08:37

Использовать iframes. Это обходной путь, но отлично работает.

Maxime написал на нем статью .

2
ответ дан shahalpk 17 August 2018 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: