Вы можете обойти X-Frame-Options в & lt; iframe & gt;
с помощью YQL. Вот доказательство концепции, протестированной в Chrome & amp; Firefox: Hacker News в & lt; iframe & gt; .
Процесс выглядит следующим образом:
loadURL
), getData
), & lt; base link & gt; ,
и & lt; script & gt;
в iframe, используя YQL, & lt; iframe & gt;
(функция loadHTML
). Пример кода JS:
var iframe = document.getElementsByTagName ('iframe' ) [0]; var url = iframe.src; var getData = function (data) {if (data & amp; & amp; data.query & amp; & amp; data.query.results & amp; data.query.results.resources & amp; data.query.results.resources. content & amp; & amp; data.query.results.resources.status == 200) loadHTML (data.query.results.resources.content); else if (data & amp; & amp; data.error & amp; & amp; data.error.description) loadHTML (data.error.description); else loadHTML ('Ошибка: Не могу загрузить' + url); }; var loadURL = function (src) {url = src; var script = document.createElement ('script'); script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent (url) + '% 22 & амп; формат = & JSON амп; диагностика = истина & амп; ENV = магазин% 3A% 2F% 2Fdatatables.org% 2Falltableswithkeys & амп; обратный вызов = GetData '; document.body.appendChild (сценарий); }; var loadHTML = function (html) {iframe.src = 'about: blank'; iframe.contentWindow.document.open (); iframe.contentWindow.document.write (html.replace (/ & lt; head & gt; / i, '& lt; head & gt; & lt; base href = "' + url + '" & gt; & lt; scr' + 'ipt & gt; document.addEventListener («click», function (e) {if (e.target & amp; e.target.nodeName == "A") {e.preventDefault (); parent.loadURL (e.target.href);}} ); & lt; / scr '+' ipt & gt; ')); iframe.contentWindow.document.close (); } loadURL (iframe.src);
Нет, это не так.
Это функция, которая была запрошена, и это неплохая идея (существует yield foreach
или эквивалент на других языках).
На данный момент Microsoft просто не выделила времени и денег для ее реализации. Они могут или не могут реализовать его в будущем; Я бы предположил (без фактической основы), что это где-то в списке дел; это просто вопрос о том, действительно ли / когда он становится достаточно высоким в этом списке.
Единственное возможное изменение, которое я мог видеть, - это реорганизовать все отдельные yield returns
сверху метода в свой собственный метод перечислимого возврата, а затем добавить новый метод, который возвращает конкатенацию этого метода и methodReturningEnumerable(x,y,z)
. Было бы лучше; нет, вероятно нет. Concat
добавит обратно столько же, сколько вы бы сохранили, если не больше.
Не может быть сделано. Это не так уж плохо. Вы можете сократить его до одной строки:
foreach (var o in otherEnumerator) yield return o;
Несвязанное примечание: вы должны быть осторожны с тем, какую логику вы включаете в свои генераторы; все выполнение отложено до тех пор, пока GetEnumerator()
не будет вызван на возвращенный IEnumerable
. Я поймал, что я неправильно выбрасываю NullArgumentException
таким образом, что я думал, что это стоит упомянуть. :)