diff --git src/wp-admin/js/widgets/text-widgets.js src/wp-admin/js/widgets/text-widgets.js
index 692a0642c9..bb19f2ffb2 100644
--- src/wp-admin/js/widgets/text-widgets.js
+++ src/wp-admin/js/widgets/text-widgets.js
@@ -4,7 +4,8 @@ wp.textWidgets = ( function( $ ) {
 	'use strict';
 
 	var component = {
-		dismissedPointers: []
+		dismissedPointers: [],
+		idBases: [ 'text' ]
 	};
 
 	/**
@@ -357,7 +358,7 @@ wp.textWidgets = ( function( $ ) {
 		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.
 
 		idBase = widgetForm.find( '> .id_base' ).val();
-		if ( 'text' !== idBase ) {
+		if ( -1 === component.idBases.indexOf( idBase ) ) {
 			return;
 		}
 
@@ -424,7 +425,7 @@ wp.textWidgets = ( function( $ ) {
 		}
 
 		idBase = widgetForm.find( '> .widget-control-actions > .id_base' ).val();
-		if ( 'text' !== idBase ) {
+		if ( -1 === component.idBases.indexOf( idBase ) ) {
 			return;
 		}
 
@@ -461,7 +462,7 @@ wp.textWidgets = ( function( $ ) {
 		widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );
 
 		idBase = widgetForm.find( '> .id_base' ).val();
-		if ( 'text' !== idBase ) {
+		if ( -1 === component.idBases.indexOf( idBase ) ) {
 			return;
 		}
 
diff --git src/wp-includes/widgets/class-wp-widget-text.php src/wp-includes/widgets/class-wp-widget-text.php
index c28ed1f317..b996595585 100644
--- src/wp-includes/widgets/class-wp-widget-text.php
+++ src/wp-includes/widgets/class-wp-widget-text.php
@@ -55,11 +55,13 @@ class WP_Widget_Text extends WP_Widget {
 		}
 		$this->registered = true;
 
+		wp_add_inline_script( 'text-widgets', sprintf( 'wp.textWidgets.idBases.push( %s );', wp_json_encode( $this->id_base ) ) );
+
 		// Note that the widgets component in the customizer will also do the 'admin_print_scripts-widgets.php' action in WP_Customize_Widgets::print_scripts().
 		add_action( 'admin_print_scripts-widgets.php', array( $this, 'enqueue_admin_scripts' ) );
 
 		// Note that the widgets component in the customizer will also do the 'admin_footer-widgets.php' action in WP_Customize_Widgets::print_footer_scripts().
-		add_action( 'admin_footer-widgets.php', array( $this, 'render_control_template_scripts' ) );
+		add_action( 'admin_footer-widgets.php', array( 'WP_Widget_Text', 'render_control_template_scripts' ) );
 	}
 
 	/**
@@ -376,8 +378,9 @@ class WP_Widget_Text extends WP_Widget {
 	 * Render form template scripts.
 	 *
 	 * @since 4.8.0
+	 * @since 4.8.2 The method is now static.
 	 */
-	public function render_control_template_scripts() {
+	static public function render_control_template_scripts() {
 		$dismissed_pointers = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );
 		?>
 		<script type="text/html" id="tmpl-widget-text-control-fields">
diff --git tests/phpunit/tests/widgets/text-widget.php tests/phpunit/tests/widgets/text-widget.php
index 41aadb6af7..6c7ec1f102 100644
--- tests/phpunit/tests/widgets/text-widget.php
+++ tests/phpunit/tests/widgets/text-widget.php
@@ -64,7 +64,8 @@ class Test_WP_Widget_Text extends WP_UnitTestCase {
 		$widget->_register();
 
 		$this->assertEquals( 10, has_action( 'admin_print_scripts-widgets.php', array( $widget, 'enqueue_admin_scripts' ) ) );
-		$this->assertEquals( 10, has_action( 'admin_footer-widgets.php', array( $widget, 'render_control_template_scripts' ) ) );
+		$this->assertEquals( 10, has_action( 'admin_footer-widgets.php', array( 'WP_Widget_Text', 'render_control_template_scripts' ) ) );
+		$this->assertContains( 'wp.textWidgets.idBases.push( "text" );', wp_scripts()->registered['text-widgets']->extra['after'] );
 	}
 
 	/**
@@ -745,10 +746,8 @@ class Test_WP_Widget_Text extends WP_UnitTestCase {
 	 * @covers WP_Widget_Text::render_control_template_scripts
 	 */
 	function test_render_control_template_scripts() {
-		$widget = new WP_Widget_Text();
-
 		ob_start();
-		$widget->render_control_template_scripts();
+		WP_Widget_Text::render_control_template_scripts();
 		$output = ob_get_clean();
 
 		$this->assertContains( '<script type="text/html" id="tmpl-widget-text-control-fields">', $output );
