Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 08-18-2011, 09:10 PM
cclaerhout's Avatar
cclaerhout cclaerhout is offline
 
Join Date: Aug 2004
Location: Paris (France)
Posts: 448
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default [vB 3] How to load Javascript code in a template called with AJAX ?

VBULLETIN 3

I made a product that modifies the Editor of the template postbit_quickedit.
  • That Editor is vB_Editor_QE_x; where x is the number of times I press "Edit" button (on the showthread page) to open the quick_editor. That number will be increment until I reload the showthread page.
  • That Editor used bbcodes with buttons. Some of this buttons have customised javascript.
    Exemple:
    • Button Template
      HTML Code:
      <td><div class="imagebutton" id="{$editorid}_insertsmallimagex" onmouseout="javascript:insertsmallimage_{$editorid}_out(this);" onmouseover="javascript:insertsmallimage_{$editorid}_over(this);" onclick="javascript:insertsmallimage_{$editorid}_dumpit();"><img src="$stylevar[imgdir_editor]/insertsmallimagex.gif" width="21" height="20" alt="$vbphrase[ab_picture_big_x]" /></div></td>
    • Javascript (in template)
      Code:
      function insertsmallimage_{$editorid}_dumpit(){var a=insertsmallimage_{$editorid}_getinput();var b=insertsmallimage_{$editorid}_getinputbis();if(a!="null"&&b!="null"){if(a&&b){result="[bimgx="+a+"]"+b+"[/bimgx]"}else{if(!a){result="[bimgx=150]"+b+"[/bimgx]"}if(!b){result="[bimgx="+a+"]$vbphrase[ab_picture_link][/bimgx]"}}window.vB_Editor["{$editorid}"].insert_text(result)}}function insertsmallimage_{$editorid}_getinputbis(){return PHP.trim(new String(prompt("$vbphrase[ab_picture]","$vbphrase[ab_picture_link]")))}function insertsmallimage_{$editorid}_getinput(){return PHP.trim(new String(prompt("$vbphrase[ab_picture_width]","$vbphrase[ab_picture_pixels]")))}function insertsmallimage_{$editorid}_out(a){vB_Editor["{$editorid}"].set_control_style(a,"button","normal")}function insertsmallimage_{$editorid}_over(a){window.vB_Editor["{$editorid}"].set_control_style(a,"button","selected")}
  • I fetch my two templates to postbit_quickedit.


Problem: The buttons using customised Javascript don't work.
Problem origin: The postbit_quickedit template is called with AJAX. So my Javascript can't be interpret.
My problem: After spending hours trying to understand how to make my hard coded Javascript code works with this template called via AJAX, I still don't get it. Is there an easy way to do it ?
P.S: I'm coding for hobby, it takes me hours to do what people here might do in 5 minutes.
The only solution I found, is to fetch my JS template to Showtread template, but it's only working for the first edit (vB_Editor_QE_1).
Reply With Quote
  #2  
Old 08-18-2011, 09:56 PM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Javascript included in a document returned by an ajax call won't be executed, as you found out. However, you can eval() it. That is, if you can get the code into a javascript string, you can just call eval(string).
Reply With Quote
  #3  
Old 08-19-2011, 12:51 AM
cclaerhout's Avatar
cclaerhout cclaerhout is offline
 
Join Date: Aug 2004
Location: Paris (France)
Posts: 448
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Thanks for your answer. Just to be sure, the eval() is the Javascript function, not the PHP function. If it's the Javascript function,where should I put it ? Inside my Javascript code which is postbit_quickedit template ? Somewhere else in my postbit_quickedit template ? Or to the parent page, the Showthread template ?
Reply With Quote
  #4  
Old 08-19-2011, 01:01 AM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Yes, I mean the javascript eval(). You say that your template called with ajax, so there has to be javascript code doing the ajax call and handling the return, right? So I guess you'd have to do the eval where the return from that ajax call is processed.
Reply With Quote
  #5  
Old 08-19-2011, 01:25 AM
cclaerhout's Avatar
cclaerhout cclaerhout is offline
 
Join Date: Aug 2004
Location: Paris (France)
Posts: 448
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

It's postbit_quickedit vB template, the one who is displayed when the "edit" button is pressed.
I understand the logic what what you said, but I'm no sure to be able to find this ^^ I'm going to keep on searching. If vB has a hook for this, don't hesitate to tell me

Thanks again.
Reply With Quote
  #6  
Old 08-19-2011, 01:38 AM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Yeah, sorry I had trouble understanding. I guess what you mean is that the template is getting sent whenever you hit edit (and you have nothing to do with that), but there's javascript in it that you'd like to execute.

Anyway, maybe someone else will have an idea.
Reply With Quote
  #7  
Old 08-19-2011, 02:16 AM
cclaerhout's Avatar
cclaerhout cclaerhout is offline
 
Join Date: Aug 2004
Location: Paris (France)
Posts: 448
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

No I guess you were right. Many websites also explain the Javascript must be eval() or something equivalent.
Sources:
But I don't know how to do it, especially with vB.

I've attached a scheme of my problem.
Attached Images
File Type: gif schema.gif (69.1 KB, 0 views)
Reply With Quote
  #8  
Old 08-19-2011, 10:07 AM
kh99 kh99 is offline
 
Join Date: Aug 2009
Location: Maine
Posts: 13,185
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I don't know if there's a clever way to do it, but if you want to run some javascript after the quick editor loads, you could modify clientscript/vbulletin_quick_edit.php. There's a function that gets called when the ajax call is complete:

HTML Code:
vB_AJAX_QuickEditor.prototype.display_editor=function(C){

(it helps if you have a program that can reformat the .js file).
Reply With Quote
  #9  
Old 08-19-2011, 03:51 PM
cclaerhout's Avatar
cclaerhout cclaerhout is offline
 
Join Date: Aug 2004
Location: Paris (France)
Posts: 448
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

I saw a product that uses "misc_start" hook to execute js:
PHP Code:
@ob_start(); ?>
function function_name(){...};
    <?php    
    header
('Content-type: application/x-javascript');
    exit;
It might be a way to do this...

--------------- Added [DATE]1313790827[/DATE] at [TIME]1313790827[/TIME] ---------------

The "quickeditor_improver" product uses a trick to get access to that Javascript file:

It uses the hook "showthread_complete" to search inside the SHOWTHREAD "clientscript/vbulletin_quick_edit.js?v=" and replaces it with a new value via misc.php page.

Code:
			unset($search, $replace);
			$search = 'clientscript/vbulletin_quick_edit.js?v=';
			$replace = 'misc.php?do=PUT_NAME_HERE_quickedit&v=';
			$vbulletin->templatecache['SHOWTHREAD'] = str_replace($search, $replace, $vbulletin->templatecache['SHOWTHREAD']);
			unset($search, $replace);
Then it uses the hook misc_start
Code:
if ($_REQUEST['do'] == 'PUT_NAME_HERE')
{
	@ob_start(); ?>
Copy here the content of "vbulletin_quick_edit.js" file (without the header)
	<?php
	header('Content-type: application/x-javascript');
	exit;
}
Now my problem is to know what code I have to use to EVAL() my javascript.

--------------- Added [DATE]1313791148[/DATE] at [TIME]1313791148[/TIME] ---------------

By the way, I found a nice website that helps to reformat code online:
http://jsbeautifier.org/

--------------- Added [DATE]1313793365[/DATE] at [TIME]1313793365[/TIME] ---------------

I've tried to put this code inside the display_editor function but it kills the quickedit function to transfer me to advanced editor :
Code:
	var div = C.responseXML.getElementById("addon_js");
			div.innerHTML = innerHTML;
			var x = div.getElementsByTagName("script");
			for(var i=0;i<x.length;i++)
			{
	       	eval(x[i].text);}
P.S: addon_js is the id of the div containing my Javascript.

--------------- Added [DATE]1313795897[/DATE] at [TIME]1313795897[/TIME] ---------------

This function looks nice, i've tried to edit it, but fail to every time

If someone got an idea...
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 03:53 AM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.07032 seconds
  • Memory Usage 2,282KB
  • Queries Executed 14 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (4)bbcode_code
  • (2)bbcode_html
  • (1)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (9)post_thanks_box
  • (9)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (9)post_thanks_postbit_info
  • (9)postbit
  • (1)postbit_attachment
  • (9)postbit_onlinestatus
  • (9)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • postbit_attachment
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete