Удалить элементы управления картой google при использовании встроенного iframe [duplicate]

Что вы можете сделать по этому поводу?

Здесь есть много хороших ответов, объясняющих, что такое пустая ссылка и как ее отладить. Но очень мало о том, как предотвратить проблему или, по крайней мере, сделать ее легче поймать.

Проверить аргументы

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

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

public void DoSomething(MyObject obj) {
    if(obj == null) 
    {
        throw new ArgumentNullException("obj", "Need a reference to obj.");
    }
}

Использовать инструменты

Есть также несколько библиотек, которые могут помочь. Например, «Resharper» может предоставить вам предупреждения во время написания кода, особенно если вы используете их атрибут: NotNullAttribute

В разделе «Контракты кода Microsoft» вы используете синтаксис, например Contract.Requires(obj != null), который дает вам проверку выполнения и компиляцию: Представление кодовых контрактов .

Существует также «PostSharp», который позволит вам просто использовать такие атрибуты:

public void DoSometing([NotNull] obj)

Сделав это и сделав PostSharp частью вашего процесса сборки, obj будет проверяться на нуль во время выполнения. См. Ошибка проверки PostSharp

Решение для простого кода

Или вы всегда можете использовать свой собственный подход, используя простой старый код. Например, вот структура, которую вы можете использовать, чтобы поймать нулевые ссылки. Он моделируется после той же концепции, что и Nullable:

[System.Diagnostics.DebuggerNonUserCode]
public struct NotNull where T: class
{
    private T _value;

    public T Value
    {
        get
        {
            if (_value == null)
            {
                throw new Exception("null value not allowed");
            }

            return _value;
        }
        set
        {
            if (value == null)
            {
                throw new Exception("null value not allowed.");
            }

            _value = value;
        }
    }

    public static implicit operator T(NotNull notNullValue)
    {
        return notNullValue.Value;
    }

    public static implicit operator NotNull(T value)
    {
        return new NotNull { Value = value };
    }
}

. Вы использовали бы очень похоже на то, как вы бы использовали Nullable, за исключением того, что цель заключалась в том, чтобы сделать абсолютно противоположное - не разрешать null. Вот несколько примеров:

NotNull person = null; // throws exception
NotNull person = new Person(); // OK
NotNull person = GetPerson(); // throws exception if GetPerson() returns null

NotNull неявно отбрасывается в и из T, поэтому вы можете использовать его в любом месте, где это необходимо. Например, вы можете передать объект Person методу, который принимает значение NotNull:

Person person = new Person { Name = "John" };
WriteName(person);

public static void WriteName(NotNull person)
{
    Console.WriteLine(person.Value.Name);
}

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

Person person = GetPerson();

public static NotNull GetPerson()
{
    return new Person { Name = "John" };
}

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

Person person = (NotNull)GetPerson();

public static Person GetPerson()
{
    return new Person { Name = "John" };
}

Объединить с Extension

Объединить NotNull с методом расширения, и вы можете охватить еще больше ситуаций. Вот пример того, как может выглядеть метод расширения:

[System.Diagnostics.DebuggerNonUserCode]
public static class NotNullExtension
{
    public static T NotNull(this T @this) where T: class
    {
        if (@this == null)
        {
            throw new Exception("null value not allowed");
        }

        return @this;
    }
}

И вот пример того, как он может быть использован:

var person = GetPerson().NotNull();

GitHub

Для вашей справки я сделал код выше, доступный на GitHub, вы можете найти его по адресу:

https://github.com/luisperezphd/NotNull

Функция родственного языка

В C # 6.0 был введен «оператор с нулевым условием», который немного помогает в этом. С помощью этой функции вы можете ссылаться на вложенные объекты, и если какой-либо из них null, все выражение возвращает null.

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

var address = country?.State?.County?.City;

Представьте, что country является объектом типа Country, который имеет свойство, называемое State и т. Д. Если country, State, County или City - null, то address will be null . Therefore you only have to check whether адрес is null`.

Это отличная функция, но она дает вам меньше информации. Это не делает очевидным, какой из 4 является нулевым.

Встроенный как Nullable?

C # имеет красивую стенографию для Nullable, вы можете сделать что-то нулевое помещая знак вопроса после такого типа int?.

Было бы неплохо, если бы у C # было что-то вроде структуры NotNull выше и имела аналогичную стенографию, может быть, восклицательный знак (!), чтобы вы могли написать что-то вроде: public void WriteName(Person! person).

198
задан 24 February 2009 в 22:46
поделиться

10 ответов

, вероятно, не так, как вы думаете. iframe должен был бы <link> в файле css тоже. И вы не можете сделать это даже с javascript, если он находится в другом домене.

3
ответ дан Al W 4 September 2018 в 09:02
поделиться
  • 1
    Можете ли вы привести пример того, как это можно сделать? Вы имеете в виду что-то вроде <iframe src="/source" link=css-stylesheet:"/css.css">? – Ant 6 May 2011 в 21:33

Вам нужен JavaScript. Это то же самое, что и на родительской странице, за исключением того, что вы должны префикс вашей команды JavaScript с именем iframe.

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

Я использую рамки Prototype , чтобы упростить его:

frame1.$('mydiv').style.border = '1px solid #000000'

или

frame1.$('mydiv').addClassName('withborder')
97
ответ дан ascx 4 September 2018 в 09:02
поделиться
  • 1
    см. мой вопрос, это похоже stackoverflow.com/questions/1962707/… , но нельзя ли изменить стиль, если кадр с другого сервера? – Jitendra Vyas 29 December 2009 в 14:27
  • 2
    Это верно. Содержимое Iframe подчиняется политике одного домена. Если это из вашего домена, вы можете контролировать его, если нет, вы заблокированы. Это предотвращает все уголки страницы на основе iframe. – Diodeus - James MacFarlane 29 December 2009 в 17:08
  • 3
    Не совсем «только CSS». решение, но достаточно для меня. +1 – Nicolae Surdu 22 May 2013 в 15:20

Сначала вы можете получить содержимое iframe, а затем использовать переключатели jQuery против них, как обычно.

$("#iframe-id").contents().find("img").attr("style","width:100%;height:100%")

$("#iframe-id").contents().find("img").addClass("fancy-zoom")

$("#iframe-id").contents().find("img").onclick(function(){ zoomit($(this)); });

Удачи!

11
ответ дан ASGM 4 September 2018 в 09:02
поделиться

Невозможно со стороны клиента. Возникает ошибка JavaScript: «Ошибка: разрешение отказано в доступе к документу свойства», так как Iframe не является частью вашего домена. Единственное решение - извлечь страницу из кода на стороне сервера и изменить необходимый CSS.

0
ответ дан Chdid 4 September 2018 в 09:02
поделиться
  • 1
    Этот ответ верен в своем «содержании», но относится к JavaScript, тогда как вопрос относится к CSS. Ответ может заключаться в том, что вам нужно использовать JavaScript, но вы этого не говорите. В ответе также предполагается, что содержимое в iFrame происходит из другого домена, что не всегда так. Наконец, точное сообщение будет отличаться от браузера к браузеру. – pwdst 22 July 2015 в 14:08

В коротком номере

Вы не можете применять CSS к HTML, который загружается в iframe, если только вы не контролируете страницу, загруженную в iframe из-за ограничений ресурсов между доменами.

78
ответ дан codename- 4 September 2018 в 09:02
поделиться
  • 1
    Это правда, но на самом деле не помогают людям привести пример того, как – Simon Pertersen 27 September 2013 в 15:24

Какой-то хакерский способ делать вещи, как сказал Юджин. Я закончил следовать его коду и привязал к своему пользовательскому Css для страницы. Проблема для меня заключалась в том, что, с временной шкалой твиттера, вам нужно немного обойти twitter, чтобы переопределить их код smidgen. Теперь у нас есть своя временная шкала с нашим css к ней, И.Е. Увеличенный шрифт, правильная высота линии и уменьшение полосы прокрутки для высот, превышающих их пределы.

var c = document.createElement('link');
setTimeout(frames[0].document.body.appendChild(c),500); // Mileage varies by connection. Bump 500 a bit higher if necessary
1
ответ дан Cole Busby 4 September 2018 в 09:02
поделиться

Да, это возможно, хотя и громоздко. Вам нужно будет напечатать / отозвать HTML-страницу страницы в теле вашей страницы, а затем применить функцию изменения правила CSS. Используя те же примеры, приведенные выше, вы, по существу, будете использовать метод синтаксического анализа для нахождения div на странице, а затем применить к нему CSS и затем перепечатать / отозвать его конечному пользователю. Мне это не нужно, поэтому я не хочу кодировать эту функцию в каждый элемент в CSS другой веб-страницы только для aphtply.

Ссылки:

36
ответ дан Community 4 September 2018 в 09:02
поделиться
  • 1
    является frame1 идентификатором iframe ?? – Toni Michel Caubet 28 November 2011 в 19:08
  • 2
    Да, frame1 является идентификатором iframe. – Eugene Rosenfeld 16 December 2011 в 01:49
  • 3
    Вопрос конкретно задает «только с использованием CSS». Имея это в виду, ваш ответ неверен. – Serj Sagan 23 September 2016 в 22:44
  • 4
    Вы больше не можете использовать это из-за той же политики происхождения в браузере Chrome. Сообщение об ошибке: Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame. – Mohammad 13 June 2017 в 20:48
  • 5
    @adamj, Можем ли мы изменить таблицу стилей перезаписи элемента iframe? если да, добавьте скрипт. – Super Model 23 July 2018 в 07:59

Быстрый ответ: Нет, извините.

Невозможно использовать только CSS. Вы должны иметь контроль над содержимым iframe, чтобы его стиль. Существуют методы, использующие javascript или ваш веб-язык выбора (о котором я немного читал, но не знакомы с самим собой), чтобы динамически вставлять некоторые необходимые стили, но вам нужен прямой контроль над содержимым iframe, которое звучит как у вас нет.

6
ответ дан Justin Lucente 4 September 2018 в 09:02
поделиться

Используйте JQuery и дождитесь загрузки источника. Вот как я достиг (используется угловой интервал, вы можете использовать метод javascript setInterval):

var addCssToIframe = function() {
    if ($('#myIframe').contents().find("head") != undefined) {
        $('#myIframe')
                .contents()
                .find("head")
                .append(
                        '<link rel="stylesheet" href="app/css/iframe.css" type="text/css" />');
        $interval.cancel(addCssInterval);
    }
};
var addCssInterval = $interval(addCssToIframe, 500, 0, false);
7
ответ дан Priyank Gupta 4 September 2018 в 09:02
поделиться
  • 1
    почему бы вам не использовать iframe-загруженное событие? – ProllyGeek 7 January 2015 в 15:16
  • 2
    да, мы можем определенно использовать это – Priyank Gupta 14 January 2015 в 07:20

По-видимому, это можно сделать через jQuery:

$('iframe').load( function() {
    $('iframe').contents().find("head")
      .append($("<style type='text/css'>  .my-class{display:none;}  </style>"));
});

https://stackoverflow.com/a/13959836/1625795

36
ответ дан Community 4 September 2018 в 09:02
поделиться
  • 1
    является frame1 идентификатором iframe ?? – Toni Michel Caubet 28 November 2011 в 19:08
  • 2
    Да, frame1 является идентификатором iframe. – Eugene Rosenfeld 16 December 2011 в 01:49
  • 3
    Вы больше не можете использовать это из-за той же политики происхождения в браузере Chrome. Сообщение об ошибке: Uncaught DOMException: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin **** from accessing a cross-origin frame. – Mohammad 13 June 2017 в 20:48
  • 4
    @adamj, Можем ли мы изменить таблицу стилей перезаписи элемента iframe? если да, добавьте скрипт. – Super Model 23 July 2018 в 07:59
Другие вопросы по тегам:

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