كيفية معرفة الفرق بين تحميل iframe مقابل تحميل iframe؟هل يتم تحميل الصفحة بأكملها في UIWebView؟

StackOverflow https://stackoverflow.com/questions/1218493

  •  10-07-2019
  •  | 
  •  

سؤال

في حدث [webView:shouldStartLoadWithRequest:navigationType:]، كيف يمكنك معرفة الفرق بين إطار iframe الذي يقوم بتحميل المحتوى مقابل إطار iframe الذي يقوم بتحميل المحتوى؟محتوى تحميل الصفحة بأكملها؟يبدو أن كلاهما يستدعي نفس الحدث بنفس الوسيطات، والفرق الوحيد هو عنوان URL الذي سيتم تحميله، لذلك لا توجد طريقة لمعرفة الفرق بين الاثنين.

لقد فكرت في بعض الطرق لمعرفة الفرق بالرغم من ذلك:

  • قم بتحليل الكود المصدري للصفحة وقم بتخزين قائمة بجميع سمات iframe src، وافترض أنه إذا كان عنوان url الذي يتم تحميله هو أحد العناصر الموجودة في قائمتي، فهو iframe.بالطبع قد يكون هذا الافتراض غير صحيح إذا انتقل بالفعل إلى الصفحة.
  • كما هو مذكور أعلاه، ولكن قم بتشغيل بعض JavaScript على الصفحة وللحصول على سمات iframe src.
  • باستخدام JavaScript، قم بإعداد الخطافات عندما يحاول المستخدم الانتقال إلى صفحة ما، على غرار http://niw.at/articles/2009/02/06/how-to-enable-the-popup-window-on-uiwebview/en
  • باستخدام JavaScript، قم بإعداد الخطافات مباشرة قبل أن يحاول إطار iframe تحميل البيانات (لست متأكدًا من كيفية القيام بشيء كهذا).
  • قم بتعديل سمة src الخاصة بكل إطار iframe لتضمين سلسلة خاصة في نهاية سمة src الخاصة به، على سبيل المثال."#iframe-loading".قم بتحميل UIWebView باستخدام كود المصدر المعدل.على الرغم من أن هذا لن يعمل إلا مع إطارات iframe التي كانت موجودة في الصفحة الأصلية حيث تم الاستعلام عنها في المرة الأولى، وليس تلك التي تم تحميلها ديناميكيًا، على سبيل المثال.عبر جافا سكريبت.
  • دع الصفحة يتم تحميلها بشكل طبيعي عن طريق العودة YES في الحدث [webView:shouldStartLoadWithRequest:navigationType:]، وبمجرد الانتهاء من التحميل، تحقق مما إذا كان عنوان URL الخاص بـ WebView قد تغير أم لا...إذا حدث ذلك، فهذا يعني أنها كانت إعادة توجيه للصفحة، وإذا لم يكن الأمر كذلك، فهذا يعني على الأرجح أنه تم تحميل إطار iframe.
  • باستخدام JavaScript، قم بتجاوز أداة ضبط خاصية window.location لتشغيل التعليمات البرمجية الخاصة بي قبل أن تقوم فعليًا بتغيير موقع النافذة.يمكنني بعد ذلك التواصل مع Objective-C لإعلامه بأن التحميل التالي سيكون في الواقع إعادة توجيه.هل هذه هي الطريقة الوحيدة لإعادة التوجيه في JavaScript؟

ما هي الطريقة الأفضل لعمل هذا؟هل يمكنك التفكير في أي طرق لم أفكر بها؟هل تحتوي إطارات iframe على حدث/خاصية خاصة يمكنني معالجتها باستخدام JavaScript لمساعدتي؟

شكرًا

تحديث:الأمر ليس بهذه البساطة مثل التحقق من نوع التنقل.على الرغم من أن النقر على رابط لفتح صفحة جديدة سيظهر كـ navigationType = 0، فإن إعادة توجيه JavaScript (تغيير window.location) ستظهر كـ navigationType = 5.يظهر تحميل iframe أيضًا كـ navigationType = 5.لذا، عندما يكون navigationType = 5، فإنك لا تعرف ما إذا كانت الصفحة بأكملها قد غيرت عناوين URL عبر JavaScript أم أنها مجرد إطار iframe يتم تحميله على نفس الصفحة.

هل كانت مفيدة؟

المحلول 2

لقد استخدمت هذه الطريقة للتو:

اسمح بتحميل الصفحة بشكل طبيعي عن طريق إرجاع YES في حدث [webView:shouldStartLoadWithRequest:navigationType:]، وبمجرد الانتهاء من التحميل، تحقق مما إذا كان عنوان URL الخاص بـ WebView قد تغير أم لا...إذا حدث ذلك، فهذا يعني أنها كانت إعادة توجيه للصفحة، وإذا لم يكن الأمر كذلك، فهذا يعني على الأرجح أنه تم تحميل إطار iframe.

نصائح أخرى

 (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{

BOOL isFrame = ![[[request URL] absoluteString] isEqualToString:[[request mainDocumentURL] absoluteString]];

}

لقد استخدمت بنجاح حقل HTTP "المرجعي" (الرأس الفعلي به خطأ إملائي) لاكتشاف ذلك.يجب أن يكون هذا إما عنوان URL للصفحة الرئيسية (متاح من عرض الويب) أو أي شيء آخر - ربما إطارًا.

NSString *referer = [request.allHTTPHeaderFields objectForKey:@"Referer"];
NSString *currentPage = [webView.request.mainDocumentURL absoluteString];
BOOL isFrameLoad = [referer isEqualToString:currentPage] == NO;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top